ASP.NET Core 'de uygulama başlatma

By Rick Anderson, Tom Dykstrave Steve Smith

web şablonlarıyla oluşturulan ASP.NET Core uygulamalar, program. cs dosyasındaki uygulama başlangıç kodunu içerir.

Aşağıdaki uygulama başlangıç kodu şunları destekler:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

StartupSınıfı Hizmetleri ve uygulamanın istek ardışık düzenini yapılandırır.

Başlangıç sınıfı

ASP.NET Core uygulamalar Startup , kural tarafından adlandırılan bir sınıfı kullanır Startup . Startup sınıfı:

  • İsteğe bağlı olarak ConfigureServices , uygulamanın hizmetlerini yapılandırmak için bir yöntem içerir. Hizmet, uygulama işlevselliği sağlayan yeniden kullanılabilir bir bileşendir. Hizmetler ConfigureServices , bağımlılık ekleme (dı) veya ile uygulama genelinde kullanılır ApplicationServices .
  • ConfigureUygulamanın istek işleme ardışık düzenini oluşturmak için bir yöntem içerir.

ConfigureServicesve Configure uygulama başlatıldığında ASP.NET Core çalışma zamanı tarafından çağrılır:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Yukarıdaki örnek Razor Sayfalariçindir; MVC sürümü benzerdir.

StartupSınıf, uygulamanın ana makinesi yapılandırıldığında belirtilir. StartupSınıfı, genellikle WebHostBuilderExtensions.UseStartup/<TStartup> yöntemi ana bilgisayar Oluşturucu üzerinde çağırarak belirtilir:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Ana bilgisayar, sınıf oluşturucusunun kullanabildiği hizmetleri sağlar Startup . Uygulama aracılığıyla ek hizmetler ekler ConfigureServices . Hem konak hem de uygulama Hizmetleri uygulama içinde ve üzerinde kullanılabilir Configure .

Startup Genel ana bilgisayar () kullanılırken oluşturucuya yalnızca aşağıdaki hizmet türleri eklenebilir IHostBuilder :

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        }
        else
        {
        }
    }
}

Çoğu hizmet, Configure Yöntem çağrılana kadar kullanılabilir değildir.

Çoklu başlangıç

Uygulama Startup farklı ortamlar için ayrı sınıflar tanımladığında (örneğin, StartupDevelopment ), çalışma zamanında uygun Startup sınıf seçilir. Geçerli ortamla eşleşen ad sonekine sahip olan sınıf önceliklendirilir. Uygulama geliştirme ortamında çalıştırıldıysanız ve hem Startup sınıf hem de StartupDevelopment sınıf içeriyorsa, StartupDevelopment sınıfı kullanılır. Daha fazla bilgi için bkz. birden çok ortam kullanma.

Konak hakkında daha fazla bilgi için konağa bakın. Başlatma sırasında hataları işleme hakkında daha fazla bilgi için bkz. Başlangıç özel durum işleme.

ConfigureServices yöntemi

ConfigureServicesYöntemi:

  • İsteğe bağlı.
  • Uygulamanın hizmetlerini yapılandırma yönteminden önce ana bilgisayar tarafından çağırılır Configure .
  • Yapılandırma seçeneklerinin kurala göre ayarlandığı yer.

Konak, Yöntemler çağrılmadan önce bazı hizmetleri yapılandırabilir Startup . Daha fazla bilgi için bkz. ana bilgisayar.

Önemli kurulum gerektiren özellikler için Add{Service} üzerinde uzantı yöntemleri vardır IServiceCollection . Örneğin, DbContext ekleyin, varsayılan ekleyin Identity , entityframeworkmağazalarını ekleyin ve sayfa ekleyin Razor :

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();
    }

Hizmet kapsayıcısına hizmet eklemek, bunları uygulama içinde ve yönteminde kullanılabilir hale getirir Configure . Hizmetler, bağımlılık ekleme veya konumundan çözümlenir ApplicationServices .

Configure yöntemi

ConfigureYöntemi, UYGULAMANıN http isteklerine nasıl yanıt verdiğini belirtmek için kullanılır. İstek ardışık düzeni, bir örneğe Ara yazılım bileşenleri eklenerek yapılandırılır IApplicationBuilder . IApplicationBuilder , yöntemi için kullanılabilir Configure , ancak hizmet kapsayıcısına kayıtlı değildir. Barındırma bir oluşturur IApplicationBuilder ve doğrudan öğesine geçirir Configure .

ASP.NET Core şablonlar işlem hattını desteğiyle birlikte yapılandırır:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Yukarıdaki örnek Razor Sayfalariçindir; MVC sürümü benzerdir.

Her Use genişletme yöntemi, istek ardışık düzenine bir veya daha fazla ara yazılım bileşeni ekler. Örneğin, UseStaticFiles ara yazılımı statik dosyalarısunacak şekilde yapılandırır.

İstek ardışık düzeninde bulunan her bir ara yazılım bileşeni, uygun olduğunda, zincirdeki bir sonraki bileşeni çağırmaktan veya zincirde kısa bir süre sonra sağlanmasından sorumludur.

, Veya gibi ek hizmetler IWebHostEnvironment , ILoggerFactory ConfigureServices Configure Yöntem imzasında belirtilebilir. Bu hizmetler varsa eklenir.

Kullanımı IApplicationBuilder ve ara yazılım işleme sırası hakkında daha fazla bilgi için bkz ASP.NET Core Middleware ..

Hizmetleri başlatmadan yapılandırma

Hizmetleri ve istek işleme işlem hattını, Startup ConfigureServices ana bilgisayar Oluşturucu üzerinde bir sınıf, çağrı ve kullanışlı yöntemler kullanmadan yapılandırmak için Configure . Birbirine eklenecek birden çok çağrı ConfigureServices . Birden çok Configure Yöntem varsa, son Configure çağrı kullanılır.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

Başlangıç filtreleriyle başlatmayı Genişlet

Şunu kullanın IStartupFilter :

  • Bir uygulamanın başlangıcında veya sonunda, açık bir çağrı olmadan ara yazılım yapılandırma ardışık düzenini yapılandırmak için Use{Middleware} . IStartupFilterASP.NET Core tarafından, uygulama yazarının varsayılan ara yazılımı açıkça kaydetmesi gerekmeden, işlem hattının başlangıcına varsayılanlar eklemek için kullanılır. IStartupFilter farklı bir bileşenin uygulama yazarı adına çağrı yapmasına izin verir Use{Middleware} .
  • Yöntem işlem hattı oluşturmak için Configure . Itartupfilter. configure , bir ara yazılımı kitaplıklar tarafından eklenen bir veya daha sonra çalışacak şekilde ayarlayabilir.

IStartupFilterConfigureöğesini alır ve döndürür Action<IApplicationBuilder> . Bir IApplicationBuilder uygulamanın istek ardışık düzenini yapılandırmak için bir sınıf tanımlar. Daha fazla bilgi için bkz. IApplicationBuilder ile bir ara yazılım işlem hattı oluşturma.

Her biri IStartupFilter , istek ardışık düzeninde bir veya daha fazla middlewares ekleyebilir. Filtreler, hizmet kapsayıcısına eklendikleri sırada çağrılır. Filtreler bir sonraki filtreye denetimi geçirmeden önce veya sonra bir ara yazılım ekleyebilir, böylece uygulama işlem hattının başına veya sonuna eklenir.

Aşağıdaki örnek, ile bir ara yazılımın nasıl kaydettirildiğini gösterir IStartupFilter . RequestSetOptionsMiddlewareAra yazılım bir sorgu dizesi parametresinden bir seçenek değeri ayarlar:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware( RequestDelegate next )
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

, RequestSetOptionsMiddleware RequestSetOptionsStartupFilter Sınıfında yapılandırılır:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

, IStartupFilter İçindeki hizmet kapsayıcısına kaydedilir ConfigureServices .

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((hostingContext, config) =>
           {
           })
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder.UseStartup<Startup>();
         })
        .ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();
        });
}

için bir sorgu dizesi parametresi option sağlandığında, ara yazılım ASP.NET Core ara yazılım tarafından yanıt oluşturmadan önce değer atamasını işler.

Ara yazılım yürütme sırası, kayıt sırasıyla ayarlanır IStartupFilter :

  • Birden çok IStartupFilter uygulama aynı nesnelerle etkileşime geçebilir. Sıralama önemliyse, IStartupFilter hizmet kayıtlarını middlewares 'in çalıştırması gereken sırayla eşleşecek şekilde sıralayın.

  • Kitaplıklar, IStartupFilter ile kaydolmadan önce veya sonra çalışan bir veya daha fazla uygulamayla bir ara yazılım ekleyebilir IStartupFilter . Bir ara yazılımı, bir kitaplık tarafından eklenen bir ara yazılımı çağırmak için IStartupFilter IStartupFilter :

    • Kitaplık hizmet kapsayıcısına eklenmeden önce hizmet kaydını konumlandırın.
    • Daha sonra çağırmak için, kitaplık eklendikten sonra hizmet kaydını konumlandırın.

Başlangıçta bir dış derlemeden yapılandırma Ekle

Uygulama IHostingStartup , uygulamanın sınıfı dışında bir dış derlemeden başlatma sırasında bir uygulamaya iyileştirmeler eklenmesine olanak sağlar Startup . Daha fazla bilgi için bkz. ASP.NET Core 'de barındırma başlangıç derlemelerini kullanın.

Ek kaynaklar