1.前言

core与早期版本的 asp.net 对比,配置应用程序的方式的 global.asax、filterconfig.cs和routeconfig.cs 都被program.cs 和 startup.cs取代了。program.cs作为web应用程序的默认入口,在没有任何修改的情况下,会调用同目录下startup.cs中的configureservices 和 configure方法。

2.startup类

startup类配置服务和应用的请求管道。program.main方法是应用程序的托管入口。在构建应用程序的主机(webhost)时,系统为应用程序指定 startup 类,而main入口通过主机生成器(iwebhostbuilder)调用build时,生成对应的应用程序的主机(webhost),并启动运行(run)。

public class program
{
    public static void main(string[] args)
    {
        createwebhostbuilder(args).build().run();
    }

    public static iwebhostbuilder createwebhostbuilder(string[] args) =>
        webhost.createdefaultbuilder(args)
            .usestartup<startup>();
}

2.1 当应用程序启动时调用 startup类

当应用程序启动时,运行时会调用startup类的 configureservices 和 configure方法:

public class startup
{
    // use this method to add services to the container.
    public void configureservices(iservicecollection services)
    {
        ...
    }

    // use this method to configure the http request pipeline.
    public void configure(iapplicationbuilder app)
    {
        ...
    }
}

startup类必须定义configure方法,但是可选择定义一个configureservices 方法,这些方法将在应用程序启动时被调用。下面我们再来了解下这两个方法。

3.configureservices方法

用于设置应用程序所需要的服务。
●该方法可选择定义或不定义。
●在configure方法配置应用程序服务之前被主机(webhost)调用。
●其中按常规设置配置选项(appsettings.json)。
对于需要大量设置的功能,iservicecollection 上有 add{service} 扩展方法。 典型 asp.net core 应用将为实体框架(entity framework)、标识(identity)和 mvc 注册服务:

public void configureservices(iservicecollection services)
{
    // 添加 entity framework服务
    services.adddbcontext<applicationdbcontext>(options =>
        options.usesqlserver(
            _configuration.getconnectionstring("defaultconnection")));
    services.adddefaultidentity<identityuser>()
        .adddefaultui(uiframework.bootstrap4)
        .addentityframeworkstores<applicationdbcontext>();

    // 添加mvc设置兼容版本服务.
    services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);

    // 添加应用程序服务.
    services.addtransient<iemailsender, authmessagesender>();
    services.addtransient<ismssender, authmessagesender>();
}

将服务添加到服务容器,使其在应用程序和configure方法中可用。服务通过依赖关系注入(di)或 applicationservices 进行解析。

4.configure方法

用于指定应用程序响应http请求的方式。
可通过将中间件(middleware)组件添加到iapplicationbuilder实例来配置请求管道。configure方法可使用 iapplicationbuilder,但未在服务容器中注册。托管创建 iapplicationbuilder并将其直接传递到configure。
通俗点来说,configure方法用于指定asp.net应用程序将如何响应每个http请求,你可以配置每个请求都接受相同的响应。而更复杂的管道配置可以封装于中间件(middleware)中,并通过扩展方法添加到iapplicationbuilder上。configure方法必须接受一个iapplicationbuilder参数。

4.1 asp.net core模板配置的管道支持:

●开发人员异常页
●异常处理程序
●http 严格传输安全性 (hsts)
●https 重定向
●静态文件
●一般数据保护条例 (gdpr)
●asp.net core mvc 和 razor pages

public void configure(iapplicationbuilder app, ihostingenvironment env)
{
    if (env.isdevelopment())
    {
        app.usedeveloperexceptionpage();
    }
    else
    {
        app.useexceptionhandler("/error");
        app.usehsts();
    }

    app.usehttpsredirection();
    app.usestaticfiles();
    app.usecookiepolicy();

    app.usemvc();
}

5.总结

●program的main方法用于创建webhost服务,调用启动类startup。
●startup中的configureservices方法用于将服务注入到 iservicecollection 服务容器中。
●startup中的configure方法用于应用响应http请求,将中间件注册到applicationbuilder中来配置请求管道。