ASP.NET Core 8 Projelerini IIS 10 ve Plesk Üzerinde Yayınlama Rehberi
ASP.NET Core 8.0, Microsoft'un geliştirdiği yüksek performanslı, ölçeklenebilir web uygulama mimarisidir. Bu rehberde C# ASP.NET Core projenizi Windows Server altyapısında IIS 10 ve Plesk Obsidian paneli kullanarak adım adım canlıya almayı, web.config yapılandırmasını ve yaygın görülen 500.19, 502.5 ve 403.14 hata kodlarının çözümlerini detaylıca ele alacağız.
⚡ Ön Gereksinimler & Sunucu Hazırlığı
- Geliştirme Ortamı: Visual Studio 2022 (v17.8+) veya .NET 8.0 SDK yüklü bilgisayar.
- ASP.NET Core Hosting Bundle: Sunucuda (IIS 10 tarafında)
AspNetCoreModuleV2işleyicisinin yüklü olması gerekir. Skyversal Windows Hosting sunucularında .NET 8.0 Hosting Bundle önceden kurulu ve yapılandırılmıştır. Kendi sunucunuzu yönetiyorsanız Microsoft Resmi Hosting Bundle İndirme Sayfası üzerinden paketi indirip IIS'iiisresetkomutuyla yeniden başlatmalısınız. - Plesk Panel Hesabı: Windows Plesk Hosting erişim bilgileri.
Adım 1 — Deployment Tipinin Seçilmesi (Publish)
ASP.NET Core projelerini sunucuya gönderirken iki farklı deployment seçeneğiniz bulunur:
- Framework-Dependent (Önerilen): Sunucuda kurulu olan .NET 8 Runtime'ı kullanır. Dosya boyutu çok küçüktür (~15 MB).
- Self-Contained: .NET çalışma zamanını kütüphanelerle birlikte paketler. Sunucuda .NET runtime sürüm bağımlılığını kaldırır.
Terminal üzerinden publish almak için aşağıdaki komutlardan birini çalıştırın:
# 1. Framework-Dependent Publish (Önerilen):
dotnet publish -c Release -o ./publish
# 2. Self-Contained Publish (x64 Bağımsız - Standalone .exe üretir):
dotnet publish -c Release -r win-x64 --self-contained true -o ./publish
Adım 2 — web.config Dosyasını Yapılandırın
.NET 6, 7 ve 8 şablonlarında üretilen web.config dosyalarında, IIS üzerindeki alt uygulamalara (child applications) ayar sızıntısını engellemek için <location path="." inheritInChildApplications="false"> sarmalayıcısı kullanılır.
⚠️ Seçtiğiniz Deployment Tipine Göre processPath Ayarı:
Framework-Dependent: processPath="dotnet" ve arguments=".\Siteniz.dll"
Self-Contained: processPath=".\Siteniz.exe" ve arguments=""
<!-- 1. Framework-Dependent web.config Örneği -->
<?xml version="1.0" encoding="utf-8"?>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\Siteniz.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
<!-- 2. Self-Contained web.config Örneği (.exe Çalıştırır) -->
<?xml version="1.0" encoding="utf-8"?>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\Siteniz.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
Adım 3 — Plesk Panel İle Yükleme & Klasör İzinleri
- Plesk Obsidian paneline giriş yapın ve Files (Dosyalar) sekmesine tıklayın.
httpdocsklasöründeki varsayılan index dosyalarını temizleyin.- Yerel bilgisayarınızdaki
publishklasörünün içeriğini zip haline getiriphttpdocsiçine yükleyin ve Extract (Çıkart) yapın. httpdocsaltındalogsadında yeni bir klasör oluşturun.- Plesk klasör izinleri (Permissions) bölümünden
logsklasörüne IIS_IUSRS veya Plesk uygulama kullanıcısı için Write (Yazma) izni verildiğini doğrulayın.
Şekil 1: Plesk Obsidian Dosya Yöneticisi üzerinden httpdocs klasörüne ASP.NET Core dosyalarının aktarılması
Adım 4 — App Pool (Uygulama Havuzu) Ayarları & Recycle
ASP.NET Core kendi dahili Kestrel web sunucusunu çalıştırdığı için IIS App Pool yöneticisinin C# kodlarını derlemesine gerek yoktur:
- Plesk paneli > Dedicated IIS Application Pool Settings kısmına gidin.
- .NET CLR Version:
No Managed Codeolarak ayarlayın. - Enable 32-Bit Applications:
Falseolmalıdır (64-bit DLL çakışmalarını önlemek için). - Dosyaları güncelledikten sonra sunucu önbelleğini temizlemek için Recycle Pool (Yeniden Başlat) butonuna basın.
🛠️ Sorun Giderme (Troubleshooting & Hata Kodları)
🔴 HTTP Error 500.19 — Internal Server Error
Sebebi: web.config XML sözdizim hatası veya sunucuda AspNetCoreModuleV2 (Hosting Bundle) bileşeninin eksik olması.
Çözümü: Sunucuda .NET 8 Hosting Bundle yüklü olduğunu doğrulayın. Kendi yönettiğiniz sunucuysa iisreset çalıştırın ve web.config etiketlerinin eksiksiz kapandığını kontrol edin.
🟡 HTTP Error 502.5 — Process Failure / App Crash
Sebebi: Uygulamanın Program.cs başlangıç aşamasında çökmesi, eksik DLL veya Siteniz.dll yolunun web.config içinde yanlış yazılması.
Çözümü: Hatanın detayını görmek için web.config dosyasında stdoutLogEnabled="true" ayarını açın. httpdocs/logs/stdout_*.log dosyasındaki C# exception detayını ve Windows Event Viewer kayıtlarını inceleyin.
🔵 HTTP Error 403.14 — Directory Browsing Not Configured
Sebebi: IIS'in isteği AspNetCoreModuleV2 modülüne yönlendiremeyip statik dosya işleyicisine (StaticFileModule) düşürmesi; ana dizinde varsayılan index belgesi (default document) olmaması ve Dizin Gezinme (Directory Browsing) özelliğinin kapalı olması.
Çözümü: web.config dosyasının alt klasörde değil doğrudan httpdocs kök dizininde yer aldığından, App Pool ayarında No Managed Code seçildiğinden ve AspNetCoreModuleV2 modülünün web.config içinde doğru tanımlandığından emin olun.