探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

原文: 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板。 在本文中,我将比较ASP.NET Core 3应用程序使用的一些不同模板,并查看一些用于ASP.NET Core 3.0中的服务和中间件配置新的帮助方法。

 翻译: Andrew Lock   https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/

探索ASP.NET Core 3.0系列一:新的项目文件、Program.cs和generic host

探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的应用中启动时运行异步任务

探索 ASP.Net Core 3.0系列五:引入IHostLifetime并弄清Generic Host启动交互

探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

下面让我们看看ASP.NET Core的模板:

(1)ASP.NET Core Empty template

(2)ASP.NET Core Web API template

(3)ASP.NET Core Web App (Model-View-Controller) template
(4)ASP.NET Core Web App (Razor) template

除了此处所不涉及的模板之外,还有更多的模板-Blazor模板,client-side 模板,worker模板-您可以通过运行dotnet new list来查看所有模板!

一、ASP.NET Core Empty template

你可以通过 dotnet new web  创建一个空的模板,您将获得配置Generic Host的标准Program.cs和下面所示的稀疏Startup.cs:

复制代码
public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
复制代码

与ASP.NET Core 2.x应用相比,主要区别在于端点路由的显着使用。 它是在2.2中引入的,但是只能用于MVC controllers。 在3.0中,端点路由是首选方法,此处提供了最基本的设置。

端点路由将选择执行哪个“端点”的过程与该端点的实际运行分开。 端点由路径模式和调用时要执行的操作组成。 可以是控制器上的MVC action,也可以是简单的lambda,如本示例所示,在该示例中,我们使用MapGet()创建 一个endpoint 。

UseRouting()扩展方法是查看传入请求并确定应执行哪个端点的方法。 在UseRouting()调用之后出现的任何中间件都将知道最终将运行哪个端点。 UseEndpoints()负责配置端点,也负责执行端点。

如果你对endpoint routing不熟悉,建议参考 以下文章:

后面我也会具体聊聊关于endpoint routing,不要急。先往下面看。

二、The ASP.NET Core Web API template

下一个最复杂的模板是通过运行dotnet new webapi创建的Web API模板。 这包括带有一个Get方法的简单[ApiController]控制器。 Startup.cs文件(如下所示)比空模板要复杂一些,但包含许多相同方面。

 默认模板中未使用IConfiguration,但IConfiguration注入到此模板的构造函数中。 在任何实际的应用程序中,您几乎都肯定需要访问它来配置服务,因此这很有意义。

在ConfigureServices中,调用了一个扩展方法AddControllers(),这是ASP.NET Core 3.0中的新增功能。 在2.x中,通常会为所有ASP.NET Core应用程序调用services.AddMvc()。 但是,这将为MVC使用的所有内容配置服务,例如Razor Pages和View呈现。 如果仅创建Web API,则这些服务是完全多余的。仅添加了创建Web API真正需要的内容,不需要的不添加,岂不更好!

 net core 3.0   webapi 截图如下:

对应AddControllersCore源码如下:

net core 3.0 mvc 截图如下:

 对应AddControllersWithViewsCore源码如下:

 接下来是HTTPS重定向中间件,该中间件可确保在安全域上发出请求(这绝对是最佳实践)。 然后,我们将在路由的早期再次使用“路由”中间件,以便后续的中间件在确定行为方式时可以使用选定的端点。

 Authorization中间件是3.0中的新增功能,并且在很大程度上归功于端点路由的引入。 您仍然可以使用[Authorize]属性装饰控制器动作,但是现在这些属性的执行在这里进行。 真正的优势在于,您可以将授权策略应用于非MVC端点,以前必须以手动,强制性方式对其进行处理。

最后,通过调用endpoints.MapControllers()映射API控制器。 这只会映射装饰有routing attributes的控制器-它不会配置任何常规路由。

三、The ASP.NET Core Web App (MVC) template

MVC模板(dotnet new mvc)包含的内容比Web API模板多了一些,但是与2.x中的等效功能相比,它已经略有减少。 只有一个控制器,即HomeController,关联的Views和所需的共享Razor模板。

Startup.cs与Web API模板非常相似,只是在下面讨论了一些区别:

复制代码
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

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

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

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

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}
复制代码

代替AddControllers()扩展方法,这次我们有了AddControllersWithViews。 如您所料,这将添加Web API和MVC通用的MVC Controller服务,而且还添加呈现Razor视图所需的服务。由于这是一个MVC应用程序,因此中间件管道包括针对Development外部环境的Exception handler中间件,并且还添加了与2.2相同的HSTS和HTTPS重定向中间件。

接下来是静态文件中间件,它位于路由中间件之前。 这样可以确保无需为每个静态文件请求进行路由,这在MVC应用程序中可能很常见。

与Web API模板的唯一区别是端点路由中间件中MVC控制器的注册。 在这种情况下,为MVC控制器添加了常规路由,而不是Web API典型的属性路由方法。 同样,这类似于2.x中的设置,但针对端点路由系统进行了调整。

四、ASP.NET Core Web App (Razor) template

Razor Pages 是ASP.NET Core 2.0中引入的,它是MVC的基于页面的替代方法。 对于许多应用程序,Razor Pages提供了比MVC更自然的模型,但是它基本上是基于MVC基础结构构建的,因此dotnet new webapp的Startup.cs看起来与MVC版本非常相似:

复制代码
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();
        });
    }
}
复制代码

此文件中的第一个更改是将AddControllersWithViews()替换为AddRazorPages()。 如您所料,这将添加Razor Pages所需的所有其他服务。 有趣的是,它没有添加将标准MVC控制器与Razor Views一起使用所需的服务。 如果要在应用程序中同时使用MVC和Razor页面,则应继续使用AddMvc()扩展方法。对Startup.cs的唯一更改是将MVC端点替换为Razor Pages端点。 与服务一样,如果您希望在应用中同时使用MVC和Razor页面,则需要同时映射两个端点。

代码如下:

复制代码
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers(); // Map attribute-routed API controllers
    endpoints.MapDefaultControllerRoute(); // Map conventional MVC controllers using the default route
    endpoints.MapRazorPages();
});
复制代码

五、总结

这篇文章简要概述了使用创建各种ASP.NET Core模板的Startup.cs文件。 每个模板都为前一个模板增加了一些额外的功能,并提供了一些额外的功能。 .NET Core 3.0 SDK模板与.NET Core 2.x的模板非常相似。 最大的新功能是能够更轻松地使你的应用包含最小所需的MVC服务以及新的终点路由,这是.NET Core 3.0中的标准路由方法。

翻译: Andrew Lock   https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/

作者:郭峥

出处:http://www.cnblogs.com/runningsmallguo/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/11789434.html