Dela via


Applikationsstart för ASP.NET Core

Not

Det här är inte den senaste versionen av den här artikeln. För den aktuella versionen, se .NET 9-versionen av den här artikeln.

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.

Viktig

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.

Av Rick Anderson

ASP.NET Core-appar som skapats med webbmallarna innehåller programmets startkod i filen Program.cs.

Vägledning för Blazor start, som lägger till eller ersätter vägledningen i den här artikeln, finns i ASP.NET Core Blazor start.

Följande appstartkod stöder flera apptyper:

using WebAll.Components;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
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.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.UseAntiforgery();

app.Run();

Appar som använder EventSource kan mäta starttiden för att förstå och optimera startprestanda. Den ServerReady händelsen i Microsoft.AspNetCore.Hosting representerar den punkt där servern är redo att svara på begäranden.

Utöka start med startfilter

Använd IStartupFilter:

  • Konfigurera mellanprogram i början eller slutet av en apps pipeline för mellanprogram utan ett explicit anrop till Use{Middleware}. Använd IStartupFilter för att lägga till standardvärden i början av pipelinen utan att uttryckligen registrera standardmellanprogrammet. IStartupFilter tillåter att en annan komponent anropar Use{Middleware} för appförfattarens räkning.
  • Skapa en pipeline av Configure-metoder. IStartupFilter.Configure kan ange att ett mellanprogram ska köras före eller efter mellanprogram som lagts till av bibliotek.

En IStartupFilter implementering implementerar Configure, som tar emot och returnerar en Action<IApplicationBuilder>. En IApplicationBuilder definierar en klass för att konfigurera en applikations begärande-pipeline. Mer information finns i Skapa en pipeline för mellanprogram med IApplicationBuilder.

Varje IStartupFilter implementering kan lägga till ett eller flera mellanprogram i pipelinen för begäranden. Filtren anropas i den ordning de lades till i tjänstcontainern. Filter kan lägga till mellanprogram före eller efter att kontrollen har överförts till nästa filter, vilket gör att de läggs till i början eller slutet av apppipelinen.

I följande exempel visas hur du registrerar ett mellanprogram med IStartupFilter. RequestSetOptionsMiddleware mellanprogram anger ett alternativvärde från en frågesträngsparameter:

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 har konfigurerats i klassen RequestSetOptionsStartupFilter:

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

Implementeringen IStartupFilter registreras i Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

När en frågesträngsparameter för option tillhandahålls bearbetar mellanprogrammet värdetilldelningen innan ASP.NET Core-mellanprogrammet återger svaret:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Körningsordningen för mellanmjukvara anges enligt ordningen av IStartupFilter-registreringar.

  • Flera IStartupFilter implementeringar kan interagera med samma objekt. Om det är viktigt med rätt ordning, beställer du registreringarna av deras IStartupFilter-tjänster så att de överensstämmer med den ordning i vilken deras mellanprogram ska köras.

  • Bibliotek kan lägga till mellanprogram med en eller flera IStartupFilter implementeringar som körs före eller efter andra appmellanprogram som registrerats med IStartupFilter. Så här anropar du ett IStartupFilter mellanprogram innan ett mellanprogram som läggs till av ett biblioteks IStartupFilter:

    • Placera tjänstregistreringen innan biblioteket läggs till i tjänstcontainern.
    • Om du vill anropa efteråt placerar du tjänstregistreringen efter att biblioteket har lagts till.

Du kan inte utöka ASP.NET Core-appen när du åsidosätter Configure. Mer information finns i det här GitHub-ärendet.

Lägga till konfiguration vid start från en extern sammansättning

Med en IHostingStartup implementering kan du lägga till förbättringar i en app vid start från en extern sammansättning utanför appens Program.cs-fil. Mer information finns i Använda värdstartssammansättningar i ASP.NET Core.

Start, ConfigureServices och Konfigurera

Information om hur du använder metoderna ConfigureServices och Configure med den minimala värdmodellen finns i:

ASP.NET Core-appar som skapats med webbmallarna innehåller programmets startkod i filen Program.cs.

Följande appstartkod stöder:

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();

Mer information om programstart finns i översikten över grunderna i ASP.NET Core.

Utvidga Startup med startfilter

Använd IStartupFilter:

  • Konfigurera mellanvara i början eller slutet av appens pipeline för mellanvara utan ett explicit anrop till Use{Middleware}. Använd IStartupFilter för att lägga till standardvärden i början av pipelinen utan att uttryckligen registrera standardmellanprogrammet. IStartupFilter tillåter att en annan komponent anropar Use{Middleware} för appförfattarens räkning.
  • Skapa en pipeline med Configure metoder. IStartupFilter.Configure kan ange att ett mellanprogram ska köras före eller efter mellanprogram som lagts till av bibliotek.

IStartupFilter implementerar Configure, som tar emot och returnerar en Action<IApplicationBuilder>. En IApplicationBuilder definierar en klass för att konfigurera en appens förfrågningspipeline. Mer information finns i Skapa en pipeline för mellanprogram med IApplicationBuilder.

Varje IStartupFilter kan lägga till ett eller flera mellanprogram i pipelinen för begäran. Filtren anropas i den ordning de lades till i tjänstcontainern. Filter kan lägga till mellanprogram före eller efter att kontrollen har överförts till nästa filter, vilket gör att de läggs till i början eller slutet av apppipelinen.

I följande exempel visas hur du registrerar ett mellanprogram med IStartupFilter. RequestSetOptionsMiddleware mellanprogram anger ett alternativvärde från en frågesträngsparameter:

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 har konfigurerats i klassen RequestSetOptionsStartupFilter:

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

IStartupFilter är registrerad i Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

När en frågesträngsparameter för option tillhandahålls bearbetar mellanprogrammet värdetilldelningen innan ASP.NET Core-mellanprogrammet återger svaret:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Körningsordningen för mellanliggande programvara anges enligt ordningen för IStartupFilter-registreringarnas.

  • Flera IStartupFilter implementeringar kan interagera med samma objekt. Om beställningen är viktig beställer du deras IStartupFilter tjänstregistreringar så att de matchar den ordning som deras mellanprogram ska köras.

  • Bibliotek kan lägga till mellanprogram med en eller flera IStartupFilter implementeringar som körs före eller efter andra appmellanprogram som registrerats med IStartupFilter. Så här anropar du ett IStartupFilter mellanprogram innan ett mellanprogram som läggs till av ett biblioteks IStartupFilter:

    • Placera tjänstregistreringen innan biblioteket läggs till i tjänstcontainern.
    • Om du vill anropa efteråt placerar du tjänstregistreringen efter att biblioteket har lagts till.

Obs! Du kan inte utöka ASP.NET Core-appen när du åsidosätter Configure. Mer information finns i det här GitHub-ärendet.

Lägga till konfiguration vid start från en extern sammansättning

Med en IHostingStartup implementering kan du lägga till förbättringar i en app vid start från en extern sammansättning utanför appens Program.cs-fil. För mer information, se Använda värdstartsmoduler i ASP.NET Core.

Klassen Startup konfigurerar tjänster och appens pipeline för begäranden.

Startklassen

ASP.NET Core-appar använder en Startup-klass som heter Startup enligt konvention. Klassen Startup:

  • Du kan även använda en ConfigureServices-metod för att konfigurera appens -tjänster. En tjänst är en återanvändbar komponent som tillhandahåller appfunktioner. Tjänsterna registreras i ConfigureServices och används i hela appen via beroendeinmatning (DI) eller ApplicationServices.
  • Innehåller en Configure metod för att skapa appens pipeline för bearbetning av begäranden.

ConfigureServices och Configure anropas av ASP.NET Core-körningen när appen startar:

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();
        });
    }
}

Föregående exempel är för Razor Pages; MVC-versionen är liknande.

Klassen Startup anges när appens värd skapas. Klassen Startup anges vanligtvis genom att anropa metoden WebHostBuilderExtensions.UseStartup/<TStartup> på värdverktyget:

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>();
            });
}

Värden tillhandahåller tjänster som är tillgängliga för Startup-klasskonstruktorn. Appen lägger till ytterligare tjänster via ConfigureServices. Både värd- och apptjänsterna är tillgängliga i Configure och i hela appen.

Endast följande tjänsttyper kan matas in i Startup konstruktorn när du använder Generic Host (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
        {
        }
    }
}

De flesta tjänster är inte tillgängliga förrän metoden Configure anropas.

Flera uppstarter

När appen definierar separata Startup klasser för olika miljöer (till exempel StartupDevelopment) väljs lämplig Startup klass vid körning. Klassen vars namnsuffix matchar den aktuella miljön prioriteras. Om appen körs i utvecklingsmiljön och innehåller både en Startup-klass och en StartupDevelopment-klass används klassen StartupDevelopment. Mer information finns i Använda flera miljöer.

Se Värd för mer information om värden. Information om hur du hanterar fel under start finns i Undantagshantering för start.

Metoden ConfigureServices

Metoden ConfigureServices är:

  • Valfri.
  • Anropas av servern före Configure-metoden för att konfigurera applikationens tjänster.
  • Där konfigurationsalternativ anges av konventionen.

Värden kan konfigurera vissa tjänster innan Startup metoder anropas. Mer information finns i Värden.

För funktioner som kräver en omfattande installation kan du använda Add{Service} tilläggsmetoder på IServiceCollection. Till exempel: Lägg tillDbContext, Lägg tillDefaultIdentity, Lägg tillEntityFrameworkStores, och Lägg tillRazorPages.

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();
    }

Genom att lägga till tjänster i tjänstcontainern blir de tillgängliga i appen och i metoden Configure. Tjänsterna hanteras via dependency injection eller från ApplicationServices.

Konfigurera-metoden

Metoden Configure används för att ange hur appen svarar på HTTP-begäranden. Begärans pipeline konfigureras genom att lägga till mellanprogram-komponenter till en IApplicationBuilder-instans. IApplicationBuilder är tillgängligt för metoden Configure, men den är inte registrerad i tjänstekontainern. Hosting skapar en IApplicationBuilder och skickar den direkt till Configure.

ASP.NET Core-mallarna konfigurerar pipelinen med stöd fö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();
        });
    }
}

Föregående exempel är för Razor Pages; MVC-versionen är liknande.

Varje Use tilläggsmetod lägger till en eller flera mellanprogramskomponenter i pipelinen för begäranden. Till exempel konfigurerar UseStaticFilesmellanprogram för att hantera statiska filer.

Varje mellanprogramskomponent i begärandepipelinen ansvarar för att anropa nästa komponent i pipelinen eller kortsluta kedjan, om det är lämpligt.

Ytterligare tjänster, till exempel IWebHostEnvironment, ILoggerFactoryeller något som definierats i ConfigureServices, kan anges i Configure-metodsignaturen. Dessa tjänster injiceras om de är tillgängliga.

Mer information om hur du använder IApplicationBuilder och ordningen på mellanprogramsbearbetning finns i ASP.NET Core Middleware.

Konfigurera tjänster utan uppstartsprocessen

Om du vill konfigurera tjänster och pipelinen för bearbetning av begäranden utan att använda en Startup-klass anropar du ConfigureServices och Configure bekvämlighetsmetoder på värdverktyget. Flera anrop till ConfigureServices läggs till efter varandra. Om det finns flera Configure metodanrop används det sista Configure-anropet.

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"];
                });
            });
        });
}

Utöka startprocessen med startfilter

Använd IStartupFilter:

  • Konfigurera mellanprogram i början eller slutet av en apps Konfigurera mellanprogramspipeline utan ett explicit anrop till Use{Middleware}. IStartupFilter används av ASP.NET Core för att lägga till standardvärden i början av pipelinen utan att appförfattaren uttryckligen behöver registrera standardmellanprogrammet. IStartupFilter tillåter att en annan komponent anropar Use{Middleware} för appförfattarens räkning.
  • Skapa en pipeline med Configure metoder. IStartupFilter.Configure kan ange att ett mellanprogram ska köras före eller efter mellanprogram som lagts till av bibliotek.

IStartupFilter implementerar Configure, som tar emot och returnerar en Action<IApplicationBuilder>. En IApplicationBuilder definierar en klass för att konfigurera appens begärandepipeline. Mer information finns i Skapa en pipeline för mellanprogram med IApplicationBuilder.

Varje IStartupFilter kan lägga till ett eller flera mellanprogram i pipelinen för begäran. Filtren anropas i den ordning de lades till i tjänstcontainern. Filter kan lägga till mellanprogram före eller efter att kontrollen har överförts till nästa filter, vilket gör att de läggs till i början eller slutet av apppipelinen.

I följande exempel visas hur du registrerar ett mellanprogram med IStartupFilter. RequestSetOptionsMiddleware mellanprogram anger ett alternativvärde från en frågesträngsparameter:

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 har konfigurerats i klassen RequestSetOptionsStartupFilter:

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

IStartupFilter är registrerad i servicebehållaren i 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>();
        });
}

När en frågesträngsparameter för option tillhandahålls bearbetar mellanprogrammet värdetilldelningen innan ASP.NET Core-mellanprogrammet återger svaret.

Körningsordningen för mellanprogram anges enligt ordningen för IStartupFilter registreringar:

  • Flera IStartupFilter implementeringar kan interagera med samma objekt. Om beställningen är viktig beställer du deras IStartupFilter tjänstregistreringar så att de matchar den ordning som deras mellanprogram ska köras.

  • Bibliotek kan lägga till mellanprogram med en eller flera IStartupFilter implementeringar som körs före eller efter andra appmellanprogram som registrerats med IStartupFilter. För att anropa ett IStartupFilter mellanprogram före ett mellanprogram som läggs till via ett biblioteks IStartupFilter:

    • Placera tjänstregistreringen innan biblioteket läggs till i tjänstcontainern.
    • Om du vill anropa efteråt placerar du tjänstregistreringen efter att biblioteket har lagts till.

Lägga till konfiguration vid start från en extern sammansättning

Med en IHostingStartup implementering kan du lägga till förbättringar i en app vid start från en extern sammansättning utanför appens Startup-klass. Mer information finns i Använda värdstartssammansättningar i ASP.NET Core.

Ytterligare resurser