Ana Sayfa Hakkımda Dersler Blog MikrofondaOn The Mic İletişim Projeler Yakında
DerslerLessons DEPLOY · C#

ASP.NET Core'da Configuration Okuma Sırası ASP.NET Core Configuration Reading Order

8 dk okuma 8 min read · Emre Ulutabak
1
Katmanlı okuma mantığı Layered reading logic

Sabah evden çıkarken üst üste giyinirsin. İç kazak, dış kazak, ceket. Dışarıdan bakan ne görür? Ceketi. İç kazak ceketin altında kalır, görünmez.

ASP.NET Core'da configuration sistemi tam böyle çalışır. Birden fazla kaynak üst üste okunur ve son okunan kazanır — önceki değeri ezer.

Okuma sırası şöyledir:

  • appsettings.json — her zaman okunur, temel değerler
  • appsettings.{Environment}.json — ortama göre okunur (Production, Development...)
  • Environment Variables — son okunur, öncekini ezer
  • Command Line Arguments — en son, sadece özel durumlarda

When you leave home in the morning, you layer up. An undershirt, a sweater, a jacket. What does someone see from outside? The jacket. The undershirt stays hidden underneath.

ASP.NET Core's configuration system works exactly like this. Multiple sources are read on top of each other, and the last one read wins — it overwrites the previous value.

The reading order is:

  • appsettings.json — always read, base values
  • appsettings.{Environment}.json — read based on environment (Production, Development...)
  • Environment Variables — read last, overwrites previous
  • Command Line Arguments — last of all, only in special cases
💡
Son okunan kazanır. Environment Variables, appsettings.json'daki aynı key'i her zaman ezer. The last one read wins. Environment Variables always override the same key in appsettings.json.
2
appsettings ve ortam dosyaları appsettings and environment files

ASPNETCORE_ENVIRONMENT değişkeni hangi ortam dosyasının okunacağını belirler. Bu değişken Production ise appsettings.Production.json okunur; Development ise appsettings.Development.json okunur.

Shared hosting'de bu değişken genellikle web.config içinde ayarlanır ya da hosting panelinden tanımlanır.

The ASPNETCORE_ENVIRONMENT variable determines which environment file is read. If this variable is Production, then appsettings.Production.json is read; if it is Development, then appsettings.Development.json is read.

On shared hosting, this variable is usually set inside web.config or defined through the hosting panel.

xml
<!-- web.config — ASPNETCORE_ENVIRONMENT ayarı -->
<aspNetCore processPath="dotnet" arguments=".\MyApp.dll"
            hostingModel="outofprocess">
  <environmentVariables>
    <!-- Bu değer appsettings.Production.json'ın okunmasını sağlar -->
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
  </environmentVariables>
</aspNetCore>
3
__ (çift alt çizgi) kuralı __ (double underscore) rule

JSON dosyalarında iç içe yapılar nokta ile temsil edilir: ConnectionStrings.DefaultConnection. Ama environment variable isimleri nokta içeremez — işletim sistemi buna izin vermez.

Bu yüzden ASP.NET Core, JSON hiyerarşisini env var'da çift alt çizgi (__) ile temsil eder.

In JSON files, nested structures are represented with dots: ConnectionStrings.DefaultConnection. But environment variable names cannot contain dots — the operating system does not allow it.

That is why ASP.NET Core represents JSON hierarchy in env vars using a double underscore (__).

csharp
// appsettings.json'daki JSON yapısı:
// {
//   "ConnectionStrings": { "DefaultConnection": "..." },
//   "EmailSettings": { "SmtpServer": "smtp.brevo.com" },
//   "Jwt": { "PrivateKeyPath": "private.key" }
// }

// Karşılık gelen environment variable key'leri:
// ConnectionStrings__DefaultConnection
// EmailSettings__SmtpServer
// Jwt__PrivateKeyPath

// Program.cs'te okuma:
var connStr = builder.Configuration.GetConnectionString("DefaultConnection");
var smtp    = builder.Configuration.GetSection("EmailSettings")["SmtpServer"];
var keyPath = builder.Configuration["Jwt:PrivateKeyPath"];
💡
Kural: JSON'da iç içe yapı → env var'da __ (çift alt çizgi). Nokta değil, çift alt çizgi. Rule: nested structure in JSON → __ (double underscore) in env var. Not a dot, a double underscore.
4
GetConnectionString kuralı GetConnectionString rule

En sık yapılan hatalardan biri budur: GetConnectionString("X") yazmak ama env var'a yanlış key koymak.

GetConnectionString("DefaultConnection") aslında Configuration["ConnectionStrings:DefaultConnection"] kısayoludur. Yani env var key'i ConnectionStrings__DefaultConnection olmalı — X ne ise key'in sonu da o olmalı.

One of the most common mistakes is writing GetConnectionString("X") but putting the wrong key in the env var.

GetConnectionString("DefaultConnection") is actually a shortcut for Configuration["ConnectionStrings:DefaultConnection"]. So the env var key must be ConnectionStrings__DefaultConnection — whatever X is, the end of the key must match it.

csharp
// Program.cs
var connStr = builder.Configuration.GetConnectionString("DefaultConnection");
// Doğru env var key: ConnectionStrings__DefaultConnection

var connStr2 = builder.Configuration.GetConnectionString("database");
// Doğru env var key: ConnectionStrings__database
// YANLIS: ConnectionStrings__DefaultConnection — eşleşmez, null döner!
💡
GetConnectionString("X") → env var key = ConnectionStrings__X. Birebir aynı olmalı. GetConnectionString("X") → env var key = ConnectionStrings__X. Must match exactly.
5
Altın kurallar Golden rules
💡
appsettings.json'a şifre koyma. Bu dosya Git'e gider, tüm ekip görür. Don't put passwords in appsettings.json. This file goes to Git and everyone on the team can see it.
💡
Sırları environment variables'a koy. Son okunur, kazanır — ve Git'e gitmez. Put secrets in environment variables. They are read last, they win — and they don't go to Git.
💡
Key eşleşmezse null döner, hata fırlatmaz. Bağlantı hatalarında ilk kontrol ettiğin yer burası olsun. If the key doesn't match, it returns null without throwing an error. When you see connection errors, check here first.
6
Mini quiz Mini quiz
MİNİ QUIZ MINI QUIZ
appsettings.json'da `EmailSettings:SmtpServer` değeri varsa, bunu ezmek için hangi environment variable key'i kullanılır? If `EmailSettings:SmtpServer` exists in appsettings.json, which environment variable key is used to override it?
EmailSettings.SmtpServer EmailSettings.SmtpServer
EmailSettings-SmtpServer EmailSettings-SmtpServer
EmailSettings__SmtpServer EmailSettings__SmtpServer
SmtpServer__EmailSettings SmtpServer__EmailSettings