IIS ve ASP.NET Core ile işlem içi barındırma
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
İşlem içi barındırma, iis çalışan işlemiyle aynı işlemde bir ASP.NET Core uygulaması çalıştırır. İşlem içi barındırma işlem dışı barındırmadan daha gelişmiş performans sağlar çünkü istekler, giden ağ trafiğini aynı makineye geri döndüren bir ağ arabirimi olan geri döngü bağdaştırıcısı üzerinden ara sunucu kullanmaz.
Aşağıdaki diyagramda IIS, ASP.NET Core Modülü ve işlem içinde barındırılan uygulama arasındaki ilişki gösterilir:
İşlem içi barındırmayı etkinleştirme
ASP.NET Core 3.0'dan bu yana, IIS'ye dağıtılan tüm uygulamalar için işlem içi barındırma varsayılan olarak etkinleştirilmiştir.
Bir uygulamayı işlem içi barındırma için açıkça yapılandırmak için, özelliğin <AspNetCoreHostingModel>
InProcess
değerini proje dosyasında (.csproj
):
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
Genel mimari
bir isteğin genel akışı aşağıdaki gibidir:
- Web'den çekirdek modundaki HTTP.sys sürücüsüne bir istek gelir.
- Sürücü yerel isteği web sitesinin yapılandırılmış bağlantı noktası üzerinden (genellikle 80 (HTTP) veya 443 (HTTPS)) IIS'ye yönlendirir.
- ASP.NET Core Modülü yerel isteği alır ve IIS HTTP Sunucusuna (
IISHttpServer
) geçirir. IIS HTTP Sunucusu, IIS için isteği yerelden yönetilene dönüştüren bir işlem içi sunucu uygulamasıdır.
IIS HTTP Sunucusu isteği işledikten sonra:
- İstek ASP.NET Core ara yazılım işlem hattına gönderilir.
- Ara yazılım işlem hattı isteği işler ve bir
HttpContext
örneği olarak uygulamanın mantığına geçirir. - Uygulamanın yanıtı IIS HTTP Sunucusu üzerinden geriye IIS'ye geçirilir.
- IIS bu yanıtı, isteği başlatan istemciye gönderir.
CreateDefaultBuilder
, UseIIS yöntemini çağırıp CoreCLR önyüklemesi yaparak bir IServer örneği ekler ve uygulamayı IIS çalışan işleminin (w3wp.exe
veya iisexpress.exe
) içinde barındırır. Performans testleri bir .NET Core uygulamasını işlem içinde barındırmanın, uygulamayı işlem dışında barındırıp istekleri Kestrel yoluna ara sunucuyla yönlendirmeye göre önemli ölçüde yüksek bir istek aktarım hızı sağladığını gösterir.
Tek bir yürütülebilir dosya olarak yayımlanan uygulamalar işlem içi barındırma modeliyle yüklenemez.
Uygulama yapılandırması
IIS seçeneklerini yapılandırmak için Program.cs
yönteminde IISServerOptions için bir hizmet yapılandırması ekleyin. Aşağıdaki örnek devre dışı bırakır AutomaticAuthentication:
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Seçenek | Varsayılan | Ayar |
---|---|---|
AutomaticAuthentication |
true |
true olduğunda, IIS Sunucusu HttpContext.User özelliğini Windows Kimlik Doğrulaması tarafından kimliği doğrulanmış olarak ayarlar. isefalse , sunucu yalnızca için HttpContext.User bir identity sağlar ve tarafından açıkça istendiğinde zorluklara AuthenticationScheme yanıt verir. AutomaticAuthentication 'ın çalışması için IIS'de Windows Kimlik Doğrulaması'nın etkinleştirilmesi gerekir. Daha fazla bilgi için bkz. Windows Kimlik Doğrulaması. |
AuthenticationDisplayName |
null |
Oturum açma sayfalarında kullanıcılara gösterilen görünen adı ayarlar. |
AllowSynchronousIO |
false |
HttpContext.Request ve HttpContext.Response için zaman uyumlu G/Ç'ye izin verilip verilmediği. |
MaxRequestBodySize |
30000000 |
HttpRequest için maksimum istek gövdesi boyutunu alır veya ayarlar. IIS'nin kendi maxAllowedContentLength sınırı olduğunu ve bu sınırın IISServerOptions içinde ayarlanan MaxRequestBodySize özelliğinden önce işleneceğini unutmayın. MaxRequestBodySize özelliğinin değiştirilmesi maxAllowedContentLength sınırını etkilemez. maxAllowedContentLength değerini artırmak için web.config dosyasına bir girdi ekleyerek maxAllowedContentLength için daha yüksek bir değer ayarlayın. Diğer ayrıntılar için bkz. Yapılandırma. |
İşlem içi ve işlem dışı barındırma arasındaki farklar
İşlemde barındırma sırasında aşağıdaki özellikler geçerlidir:
IIS HTTP Sunucusu (
IISHttpServer
), sunucu yerine Kestrel kullanılır. İşlem sırasında şuCreateDefaultBuilder
çağrılar UseIIS yapılır:- öğesini
IISHttpServer
kaydedin. - ASP.NET Çekirdek Modülü arkasında çalışırken sunucunun dinlemesi gereken bağlantı noktasını ve temel yolu yapılandırın.
- Başlangıç hatalarını yakalamak için konağı yapılandırın.
- öğesini
requestTimeout
özniteliği, işlem içi barındırma için geçerli değildir.Uygulamalar arasında uygulama havuzu paylaşımı desteklenmez. Uygulama başına bir uygulama havuzu kullanın.
Uygulamanın ve yüklü çalışma zamanının mimarisi (bitlik) (x64 veya x86) uygulama havuzunun mimarisiyle eşleşmelidir. Örneğin, 32 bit (x86) için yayımlanan uygulamaların IIS Uygulama Havuzları için 32 bit etkinleştirilmiş olması gerekir. Daha fazla bilgi için IIS sitesi oluşturma bölümüne bakın.
İstemci bağlantısı kesiliyor algılandı. İstemci
HttpContext.RequestAborted
bağlantısı kesildiğinde iptal belirteci iptal edilir.İşlem içinde barındırılırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Talepleri bir IClaimsTransformation uygulamayla dönüştürürken, kimlik doğrulama hizmetleri eklemek için çağrısı AddAuthentication :
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
- Web Paketi (tek dosyalı) dağıtımlar desteklenmez.
Zamanlama bilgilerini alma
Bkz . IHttpSysRequestTimingFeature ile ayrıntılı zamanlama bilgilerini alma.
İşlem içi barındırma, iis çalışan işlemiyle aynı işlemde bir ASP.NET Core uygulaması çalıştırır. İşlem içi barındırma işlem dışı barındırmadan daha gelişmiş performans sağlar çünkü istekler, giden ağ trafiğini aynı makineye geri döndüren bir ağ arabirimi olan geri döngü bağdaştırıcısı üzerinden ara sunucu kullanmaz.
Aşağıdaki diyagramda IIS, ASP.NET Core Modülü ve işlem içinde barındırılan uygulama arasındaki ilişki gösterilir:
İşlem içi barındırmayı etkinleştirme
ASP.NET Core 3.0'dan bu yana, IIS'ye dağıtılan tüm uygulamalar için işlem içi barındırma varsayılan olarak etkinleştirilmiştir.
Bir uygulamayı işlem içi barındırma için açıkça yapılandırmak için, özelliğin <AspNetCoreHostingModel>
InProcess
değerini proje dosyasında (.csproj
):
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
Genel mimari
bir isteğin genel akışı aşağıdaki gibidir:
- Web'den çekirdek modundaki HTTP.sys sürücüsüne bir istek gelir.
- Sürücü yerel isteği web sitesinin yapılandırılmış bağlantı noktası üzerinden (genellikle 80 (HTTP) veya 443 (HTTPS)) IIS'ye yönlendirir.
- ASP.NET Core Modülü yerel isteği alır ve IIS HTTP Sunucusuna (
IISHttpServer
) geçirir. IIS HTTP Sunucusu, IIS için isteği yerelden yönetilene dönüştüren bir işlem içi sunucu uygulamasıdır.
IIS HTTP Sunucusu isteği işledikten sonra:
- İstek ASP.NET Core ara yazılım işlem hattına gönderilir.
- Ara yazılım işlem hattı isteği işler ve bir
HttpContext
örneği olarak uygulamanın mantığına geçirir. - Uygulamanın yanıtı IIS HTTP Sunucusu üzerinden geriye IIS'ye geçirilir.
- IIS bu yanıtı, isteği başlatan istemciye gönderir.
CreateDefaultBuilder
, UseIIS yöntemini çağırıp CoreCLR önyüklemesi yaparak bir IServer örneği ekler ve uygulamayı IIS çalışan işleminin (w3wp.exe
veya iisexpress.exe
) içinde barındırır. Performans testleri bir .NET Core uygulamasını işlem içinde barındırmanın, uygulamayı işlem dışında barındırıp istekleri Kestrel yoluna ara sunucuyla yönlendirmeye göre önemli ölçüde yüksek bir istek aktarım hızı sağladığını gösterir.
Tek bir yürütülebilir dosya olarak yayımlanan uygulamalar işlem içi barındırma modeliyle yüklenemez.
Uygulama yapılandırması
IIS seçeneklerini yapılandırmak için ConfigureServices yönteminde IISServerOptions için bir hizmet yapılandırması ekleyin. Aşağıdaki örnek AutomaticAuthentication özelliğini devre dışı bırakır:
services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
Seçenek | Varsayılan | Ayar |
---|---|---|
AutomaticAuthentication |
true |
true olduğunda, IIS Sunucusu HttpContext.User özelliğini Windows Kimlik Doğrulaması tarafından kimliği doğrulanmış olarak ayarlar. isefalse , sunucu yalnızca için HttpContext.User bir identity sağlar ve tarafından açıkça istendiğinde zorluklara AuthenticationScheme yanıt verir. AutomaticAuthentication 'ın çalışması için IIS'de Windows Kimlik Doğrulaması'nın etkinleştirilmesi gerekir. Daha fazla bilgi için bkz. Windows Kimlik Doğrulaması. |
AuthenticationDisplayName |
null |
Oturum açma sayfalarında kullanıcılara gösterilen görünen adı ayarlar. |
AllowSynchronousIO |
false |
HttpContext.Request ve HttpContext.Response için zaman uyumlu G/Ç'ye izin verilip verilmediği. |
MaxRequestBodySize |
30000000 |
HttpRequest için maksimum istek gövdesi boyutunu alır veya ayarlar. IIS'nin kendi maxAllowedContentLength sınırı olduğunu ve bu sınırın IISServerOptions içinde ayarlanan MaxRequestBodySize özelliğinden önce işleneceğini unutmayın. MaxRequestBodySize özelliğinin değiştirilmesi maxAllowedContentLength sınırını etkilemez. maxAllowedContentLength değerini artırmak için web.config dosyasına bir girdi ekleyerek maxAllowedContentLength için daha yüksek bir değer ayarlayın. Diğer ayrıntılar için bkz. Yapılandırma. |
İşlem içi ve işlem dışı barındırma arasındaki farklar
İşlemde barındırma sırasında aşağıdaki özellikler geçerlidir:
IIS HTTP Sunucusu (
IISHttpServer
), sunucu yerine Kestrel kullanılır. İşlem sırasında şuCreateDefaultBuilder
çağrılar UseIIS yapılır:- öğesini
IISHttpServer
kaydedin. - ASP.NET Çekirdek Modülü arkasında çalışırken sunucunun dinlemesi gereken bağlantı noktasını ve temel yolu yapılandırın.
- Başlangıç hatalarını yakalamak için konağı yapılandırın.
- öğesini
requestTimeout
özniteliği, işlem içi barındırma için geçerli değildir.Uygulamalar arasında uygulama havuzu paylaşımı desteklenmez. Uygulama başına bir uygulama havuzu kullanın.
Uygulamanın ve yüklü çalışma zamanının mimarisi (bitlik) (x64 veya x86) uygulama havuzunun mimarisiyle eşleşmelidir. Örneğin, 32 bit (x86) için yayımlanan uygulamaların IIS Uygulama Havuzları için 32 bit etkinleştirilmiş olması gerekir. Daha fazla bilgi için IIS sitesi oluşturma bölümüne bakın.
İstemci bağlantısı kesiliyor algılandı. İstemci
HttpContext.RequestAborted
bağlantısı kesildiğinde iptal belirteci iptal edilir.İşlem içinde barındırılırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Talepleri bir IClaimsTransformation uygulamayla dönüştürürken, kimlik doğrulama hizmetleri eklemek için çağrısı AddAuthentication :
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IClaimsTransformation, ClaimsTransformer>(); services.AddAuthentication(IISServerDefaults.AuthenticationScheme); } public void Configure(IApplicationBuilder app) { app.UseAuthentication(); }
Web Paketi (tek dosyalı) dağıtımlar desteklenmez.
ASP.NET Core