Magnus Mårtensson
Microsoft Regional Director, Azure MVP, CEO Loftysoft
Avirag Jain
Director & CTO R Systems
Mahesh Chand
Founder C# Corner, CEO Mindcracker
Chris Gali
CEO & Co-Founder Graphite
Subinder Khurana
Chief Architect StoryProcess, Founder NASSCOM DeepTech Club
Bryan Rishforth
Investor, Chairman Graphite
Bryn Everson
Director Biz Dev Graphite
Raj Tiwari
Digital Transformation Leader, Futurist and Visionary
Joseph Guadagno
Microsoft MVP, Lead Quicken Loans
Nikita Sachdev
Entrepreneur, Blockchain Enthusiast & Advisor, Social Media Influencer
Doug Wagner
COO & Founder Adapt Technical Group
Ritesh Modi
Architect, Senior Evangelist, Cloud Architect
Crystal Wenrick
Director Communications Mindcracker
Allen O’Neill
Microsoft MVP, Consulting Engineer/Architect
Praveen Kumar
CEO MCN Solutions
Chris Love
Founder Love2Dev, Microsoft MVP, Author
Sanjay Vyas
Microsoft Regional Director, Microsoft MVP, Founder & CEO SkillLabs Technologies
Veena Sarda
Deep Learning Consultant, Author
Sekhar Srinivasan
C# Corner MVP, Microsoft Certified Trainer, Pluralsight Author
Lalit Bansal
Founder & CEO - EIY SYS
Navdeep Garg
CEO Revinfotech
Prakash Tripathi
Tech Manager/Leader, Microsoft MVP, Blogger
Bhavna Jain
Breakthrough Consultant
Naveen Sharma
Enterprise Architect, Leadership Coach, Author
Vidya Vrat Agarwal
Principal Architect, Microsoft MVP, Author
Sheetal Agarwal
Founder Clownselors, Medical Clown, Trainer
Abhishek Kant
Founder GTM Catalyst
Vishnu Saran
Founder & CEO VoiceQube
Sandeep Soni
Founder & CEO Deccansoft, Microsoft Certified Trainer
Parveen Malik
AVP InfoSec & Vulnerability Management, Information Security Expert
Nitin Pandit
Microsoft MVP, Developer Evangelist, Author
Niloshima Srivastava
C# Corner MVP, Tech Architect, Trainer, Blogger
Bala Chirtsabesan
Senior Software Engineer at Microsoft, Author
Manoj Mittal
Sr. Technical Architect, C# Corner MVP, Author
Chandni Di
Co-Founder Voice of Slum
Vithal Wadje
Technical Lead, Microsoft MVP, Author
Shivam Ahuja
Founder SkillCircle, Business Mentor
Chervine Bhiwoo
Solution Architect, Microsoft MVP, Author
Saurabh Jain
Vice President Paytm, Founder Fun2Do Labs, Author
Vinay Solanki
Head IoT at Lenovo, Founder IoT-NCR
Anshu kumari
Founder Blockchainkids, Inventor, Trainer
Amit Singal
CEO Startup Buddy
Dev Pratap
Co-Founder & CEO Voice of Slum
Amey Vartak
Technology Consultant, Full Stack Developer, C# Corner MVP, Author
Viswanatha Swamy
Principal Software Engineer, C# Corner MVP, Author
Sanket Verma
Research Engineer @ Ballistics (Forensics) and Chair, PyData Delhi
Sourabh Somani
Lead Developer, Microsoft MVP, Author
Abhishek Mishra
Software Architect, C# Corner MVP, Author
Siddharth Vaghasia
Technical Consultant, C# Corner MVP, Blogger
Bassam Alugili
Senior Software Specialist, Database Expert
S Ravi Kumar
Solution Architect, C# Corner MVP, Author
Sundaram Subramanian
Full Stack Developer, C# Corner MVP, Speaker
Deepesh Somani
Solution Architect, Microsoft MVP, Author
Debasis Saha
Technical Project Manager, C# Corner MVP, Blogger, Author
Vipul Jain
Software Architect, C# Corner MVP, Author
Akshay Patel
Technical Architect, Microsoft Certified Trainer, C# Corner MVP, Author
Stephen Simon
RPA Developer, Evangelist, Author
Vivek Sharma
Founder Kingster636, AR/VR Specialist
Jeetendra Gund
Technical Lead, C# Corner MVP, Author
Sujal Beniwal
AI Enthusiast, Student
M Viknaraj
Microsoft MVP, Azure Architect, Author
Prasham Sabadra
Software Architect, C# Corner MVP, Trainer, Author
Aakash Maurya
Senior Developer, C# Corner MVP, Speaker
Ankit Sharma
Senior Software Engineer, C# Corner MVP, Author
Mangesh Gaherwar
Team Lead, C# Corner MVP, Author
Viral Jain
Technical Consultant, C# Corner MVP, Author
Bhasker Das
Solution Architect, Evangelist
Manish Dwivedi
Associate Project Manager
Ck Nitin
Programmer, Author
Rohit Gupta
Technical Trainer, Author
Manish Tewatia
Full-stack Marketer, UX Designer
Bhavya Gaur
Technical Illustrator
Rohit Tomar
SEO/SMO Expert
Web Track
Cloud & Data Track
Dev Track
Registration & Breakfast
Future of Desktop Apps with JS (ElectronJs)
Nitin Pandit
Building Serverless Microservices Using Microsoft Azure
Vithal Wadje
Innovating RPA: A Robot for Every Person
Stephen Simon
Managing Cloud Storage Accounts using Logic Apps
Viknaraj Manogararajah
Data visualization using Python
Sekhar Srinivasan
Going Cross platform with AR Foundation
Vivek Sharma
Keynote
Managing your Azure dependencies in ASP.NET Core apps using VS
Bala Chirtsabesan
Securing Applications on Intelligent Azure
Abhishek Mishra
Getting started with Blazor the Framework of Future
S Ravi Kumar
Lunch
Build Progressive Web Apps using Angular 9
Debasis Saha
Build and deploy to any platform using Azure DevOps
Chervine Bhiwoo
Deep Dive in Azure Service Bus
Akshay Patel
Build a Native Mobile Application using React Native and JavaScript
Joseph Guadagno
Making sense of Web Job, Web Job SDK and Functions in Azure
Prakash Tripathi
CloudFront Distribution in AWS
Viral Jain
Tea Break
Introduction to PowerBI
Aakash Maurya
Build Advanced SPFx solutions with React and Graph API
Siddharth Vaghasia
Build Business Intelligence Analyst (BIA) Skills
Sundaram Subramanian
Deep dive of Power Platform – AI BUILDER
Prasham Sabadra
Panel 1
What's new in SharePoint development
Vipul Jain
Build a SSO (Single Sign On) based Native JavaScript application with Microsoft Identity within 10 minutes
Manoj Mittal
Panel 2
Applications and working of AI
Veena Sarda
Deploying serverless API's with .Net core 3.0 on AWS & Azure
Amey Vartak
Panel 3
Blockchain with .NET Core (Ark)
Anshu Kumari
Closing Note & Prize Distribution
Dev Track
Cloud Track
Architecture Track
Emerging Tech Track
Registration & Breakfast
Creating Full-Stack Web Apps Using Server-Side Blazor
Ankit Sharma
Real time face recognition with MS Cognitive Services
Niloshima Srivastava
Building Scalable APIs with GraphQL
Jeetendra Gund
Future of development with AI and Blockchain
Navdeep Garg
Debugging Tips and Tricks with Visual Studio 2019
Joseph Guadagno
Azure Containers
Abhishek Kant
Enterprise Architecture
Naveen Sharma
Bot Framework - learn it fast and look like a boss!
Allen O’Neill
Keynote
.Net Core & C# 8 Performance
David McCarter
Working with Azure kubernetes services
Ritesh Modi
Becoming an Architect
Vidyavrat Agarwal
Why Techies Need to Learn Product Management
Saurabh Jain
Lunch
Build a rules engine in .Net Core
Sanjay Vyas
Building CI and CD Pipeline using Azure DevOps
Sandeep Soni
Entity Framework Core - Tips and Tricks, Performance Optimization, and Tuning
Bassam Alugili
Hacking your way into Data Science
Sanket Verma
Speed up your .Net Core Website
Sourabh Somani
Azure
Magnus Mårtensson
Demystifying Open Distro for Elasticsearch
Suman Debnath
Future of Data
Shivam Ahuja
Tea Break
gRPC with C# and .Net Core
Mangesh Gaherwar
Panel 1
Essentials of Cloud security
Parveen Malik
Power platform and Dynamics 365
Deepesh Somani
Microservices - the gRPC Way
Viswanatha Swamy
Panel 2
Reserved
Reserved
Closing Note & Prize Distribution
Configuring environment-specific app settings in .NET Core
A .NET Core application rarely runs with the same settings everywhere. Local development may use a developer workstation and a local database, while testing runs against shared services and production uses managed Azure resources. Environment-specific configuration lets the application keep one codebase while selecting suitable values for each stage.
The standard approach combines appsettings.json, environment-specific JSON files, environment variables, command-line arguments and secret stores. Understanding how these providers are layered is essential for applications deployed across Australian data centres, Azure App Service, containers or an internal platform team.
How the configuration hierarchy works
A typical ASP.NET Core application starts with a base file named appsettings.json. It can then load a more specific file such as appsettings.Development.json, appsettings.Testing.json or appsettings.Production.json. Values in the later file override matching values from the base file.
The default host created by modern .NET templates already includes these providers. In a web application using WebApplication.CreateBuilder(args), the framework generally loads JSON configuration, user secrets in development, environment variables and command-line arguments in an established order. A value supplied later in that sequence has higher priority.
var builder = WebApplication.CreateBuilder(args);
// Configuration is already loaded by the default builder.
var connectionString =
builder.Configuration.GetConnectionString("Orders");
var app = builder.Build();
app.Run();
Avoid adding the same providers again unless there is a specific reason. Duplicate registrations can make precedence difficult to understand and may cause a file to be read twice. If a custom host is required, document the provider order clearly in the startup code.
Selecting the active environment
The host determines the current environment through an environment variable. ASPNETCORE_ENVIRONMENT is widely used by ASP.NET Core applications, while DOTNET_ENVIRONMENT is used by the generic host and newer hosting models. With WebApplicationBuilder, DOTNET_ENVIRONMENT takes precedence when both variables are present; traditional web host configuration can apply different precedence rules.
Set the value before the process starts. On Windows PowerShell, a local developer might use:
$env:ASPNETCORE_ENVIRONMENT = "Development"
dotnet run
On macOS, Linux or a container platform, the equivalent is:
ASPNETCORE_ENVIRONMENT=Testing dotnet run
The name is case-insensitive on Windows but can be case-sensitive in surrounding tooling on Linux. Use a small, agreed set of names, such as Development, Testing, Staging and Production. An Australian delivery team working across Sydney, Brisbane and Perth should keep these names consistent in source control, build pipelines and runbooks rather than inventing regional variants for ordinary deployment stages.
The environment name is available through IHostEnvironment or IWebHostEnvironment:
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
Use environment checks for behaviour that genuinely differs, such as developer diagnostics. Do not scatter environment-specific business rules throughout controllers and services. Put changeable values in configuration and bind them to options instead.
Organising JSON settings files
A base file should contain safe defaults that apply everywhere. The environment-specific file should contain only the differences. This keeps configuration readable and reduces the possibility that production values are accidentally copied into a local repository.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Orders": {
"ApiBaseUrl": "https://orders.example.internal",
"TimeoutSeconds": 30
}
}
A development override might look like this:
{
"Orders": {
"ApiBaseUrl": "https://localhost:7240",
"TimeoutSeconds": 60
}
}
The second document could be saved as appsettings.Development.json. JSON configuration is hierarchical, so nested objects map naturally to sections. Keep production credentials, API keys and passwords out of both files. Even a private repository can be copied, indexed or exposed through a build artefact.
For an Australian organisation, the deployment region may need to be explicit where data residency matters. An Azure resource in australiaeast near Sydney and one in australiasoutheast near Melbourne can have different network paths, service availability and disaster-recovery implications. A setting such as Storage:AccountName can vary by environment, but the secret used to access that storage should come from a protected provider.
Overriding values with environment variables
Environment variables are convenient for CI/CD systems, Docker, Kubernetes and Azure App Service. They should use double underscores to represent nested configuration keys because the colon separator is not portable across operating systems and shells.
For the JSON section Orders:TimeoutSeconds, set:
Orders__TimeoutSeconds=45
For a connection string named Orders, use:
ConnectionStrings__Orders=Server=db;Database=orders;User Id=app;
The environment variable normally overrides the same key from JSON. This allows one image or deployment package to move from testing to production without modifying files inside the package. In an Azure App Service deployment, application settings are exposed to the process as environment variables, making them suitable for non-secret operational values and references to secret services.
Be careful with shell quoting, multiline values and special characters. A password containing $, ; or spaces can be altered by the shell before .NET reads it. Container manifests and pipeline variable groups should make these values explicit. The : form may work in some environments, but __ is the reliable cross-platform convention.
Environment variables can also configure logging:
Logging__LogLevel__Default=Warning
They are useful for urgent operational changes, although every override should be recorded in the deployment system. An unexplained variable left on a production host can be harder to detect than a visible JSON change.
Binding settings to typed options
Reading values directly throughout the application is fragile:
var timeout = configuration["Orders:TimeoutSeconds"];
The result is a string, validation is postponed and key names are repeated. The options pattern provides a typed boundary between configuration and application code.
public sealed class OrdersOptions
{
public const string SectionName = "Orders";
public string ApiBaseUrl { get; set; } = string.Empty;
public int TimeoutSeconds { get; set; }
}
Register and validate the section during startup:
builder.Services
.AddOptions<OrdersOptions>()
.Bind(builder.Configuration.GetSection(OrdersOptions.SectionName))
.Validate(options => Uri.TryCreate(
options.ApiBaseUrl, UriKind.Absolute, out _),
"ApiBaseUrl must be an absolute URI")
.Validate(options => options.TimeoutSeconds > 0,
"TimeoutSeconds must be greater than zero")
.ValidateOnStart();
A service can then receive IOptions<OrdersOptions>. Use IOptionsSnapshot<T> when values may differ by request scope, and IOptionsMonitor<T> when a long-running process needs to observe reloadable configuration. ValidateOnStart() is especially valuable because a deployment fails immediately when a required setting is missing, instead of failing during the first customer request.
For secrets, use user secrets during local development, Azure Key Vault or another managed secret store in hosted environments, and a CI/CD secret facility for pipeline credentials. Australian businesses handling personal information should align secret management with the Privacy Act obligations and internal controls such as the Essential Eight. Logging an options object can unintentionally expose credentials, so redact sensitive fields.
Handling deployment and configuration reloads
Local JSON files commonly use reloadOnChange: true, allowing a running developer process to notice edits. This can be useful for logging levels or feature flags, but it should not be treated as a universal production strategy. In containers and some mounted volumes, file change notifications may be delayed or unavailable.
A safer operational model is to build an immutable application package and inject environment-specific values during deployment. The same container image can be promoted from a testing cluster to production while the platform supplies different endpoints, credentials and feature settings. This reduces configuration drift between stages.
Be aware that changing a setting does not automatically recreate clients that copied the old value during startup. An HttpClient, database pool or SDK client may retain its endpoint until the process restarts. For critical changes, a controlled restart is easier to reason about than relying on live reload.
Time zones deserve particular attention in Australian systems. Store timestamps in UTC, then apply an explicit business time zone such as Australia/Sydney or Australia/Perth when displaying or scheduling work. Sydney observes daylight saving while Perth does not, and a setting based on a fixed +10:00 offset will eventually produce incorrect results. Keep time-zone identifiers in configuration where the business rule requires them.
Testing configuration before release
Configuration tests should verify that the intended environment file is loaded and that higher-priority providers win. ConfigurationBuilder can create an in-memory configuration for unit tests, while integration tests can use temporary JSON files and environment variables.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["Orders:ApiBaseUrl"] = "https://test.example",
["Orders:TimeoutSeconds"] = "15"
})
.Build();
var options = configuration
.GetSection("Orders")
.Get<OrdersOptions>();
Assert.Equal(15, options!.TimeoutSeconds);
A deployment pipeline should check that production has every required setting without printing its value. Health checks can verify connectivity to a database or external API, but they should avoid exposing connection strings in response bodies or logs. Treat missing configuration as a release failure rather than silently accepting an empty string.
The following patterns suit different operational needs:
| Approach | Best use | Main advantage | Main risk |
|---|---|---|---|
appsettings.json |
Shared defaults | Easy to review and version | Secrets may be committed |
appsettings.{Environment}.json |
Stage-specific non-secret values | Clear separation by environment | File drift between stages |
| Environment variables | CI/CD, containers and App Service | Overrides values without rebuilding | Shell and naming mistakes |
| User Secrets | Local developer credentials | Keeps secrets out of source control | Intended for development only |
| Key Vault or managed secret store | Production credentials | Centralised access and auditing | Requires identity and availability planning |
| Typed options with validation | Application settings | Strong types and early failure | Needs deliberate validation rules |
Choosing a maintainable configuration strategy
A practical setup starts with conservative defaults in appsettings.json, adds small environment-specific overrides, and uses environment variables for deployment-time differences. Sensitive values should come from a secret manager, with managed identity preferred where the hosting platform supports it.
The startup path should be predictable: determine the environment, load the standard providers, bind important sections to typed options, validate them at startup and expose only safe operational information through diagnostics. This approach works for a laptop in Adelaide, an Azure App Service in Australia East or a container workload deployed to a Melbourne-based region.
Clear naming is as important as the code. Use Orders__ApiBaseUrl, ConnectionStrings__Orders and Logging__LogLevel__Default consistently across local scripts, GitHub Actions, Azure DevOps and production manifests. Keep a non-secret configuration reference alongside the application so developers and operations staff can see which settings exist, which are mandatory and which deployment system supplies them.
1, CBD, Maharaj Surajmal Road, Near Yamuna Sports Complex, Delhi, 110032
GENERAL QUERIES
Manish Tewatia
manish@csharpcon.com
+91-9718-431-042
TICKET QUERIES
Atul Gupta
conference@csharpcon.com
+91-9910-125-804