ASP.NET CORE 基础知识(一):概述【上】

此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解

原文请参考 MSDN ASP.NET Core

这篇文章是对一些关键概念的概述,它们可以帮助你理解如何开发ASP.NET Core应用程序。

Startup类

      在startup类中:

  •    配置了应用程序需要的服务
  •    定义了请求处理管道

      所谓服务,便是app需要用到的一些组件。举个例子,一个日志组件便是一个服务。配置服务(或者说是注册服务)的代码被加在Startup.ConfigureServices方法中。

      而请求处理管道包含一些列的中间件组件。举例来说,一个中间件可能会处理对静态文件的请求,或者将HTTP请求重定向为HTTPS请求。每一个中间件都会在HttpContext对象上进行异步操作,接下来其要么激活请求管道中的下一个中间件,要么终止请求。配置请求处理管道的代码被添加在了 Startup.Configure方法中。

      这里有一个示例的Startup类:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddDbContext<MovieContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MovieDb")));
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseMvc();
    }
}

         获取更多的信息,请参考:App startup in ASP.NET Core.

      依赖注入(服务)

      ASP.NET Core有一个内建的DI框架,其使得已配置的服务对于应用程序的类来说是可用的。在一个类中获取一个服务实例的一种方式便是创建一个构造函数,并以所需的类型作为此构造函数的参数。构造函数的参数可以是服务类型或者接口。DI系统会在运行时提供具体的服务实例。

      如下是一个类,其使用DI来获取Entity Framework Core上下文对象。高亮显示的那行是构造函数注入的示例:

     

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;

    public IndexModel(RazorPagesMovieContext context)
    {
        _context = context;
    }
    // ...
    public async Task OnGetAsync()
    {
        var movies = from m in _context.Movies
                        select m;
        Movies = await movies.ToListAsync();
    }
}

     虽然DI是内建的,但其设计为可以使你插入第三方的IoC容器,因而如果你愿意的话,便可以对其进行自定义。

 中间件

        请求处理管道包含一些列的中间件组件。每一个中间件都会在HttpContext对象上进行异步操作,接下来其要么激活请求管道中的下一个中间件,要么终止请求。按照约定,中间件组件通过在Startup.Configure中调用它的UseXXX扩展方法被添加到管道中。举例来说,为了启用对于静态文件的渲染,便会调用UseStaticFiles方法。

       如下示例中,高亮代码配置了请求处理管道:

       

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddDbContext<MovieContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MovieDb")));
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseMvc();
    }
}

       ASP.NET Core包含一组丰富的内建的组件,除此之外,你也可以写自己的自定义组件。

       获取更多的信息,请参考ASP.NET Core Middleware

       宿主

       ASP.NET Core app在Startup类中建立了宿主。宿主是封装了所有app资源的一个对象,比如:

  •       一个HTTP 服务实现
  •       中间件组件
  •       日志
  •       依赖注入
  •       配置系统

     将app所有相互依存的资源包含在一个对象的主要理由便是生命周期管理,在Startup中进行控制并优雅的关闭。

     两种宿主是可用的:Generic Host 以及 Web Host。推荐使用Generic Host,而 Web Host仅仅用于向后兼容。

     创建宿主的代码是在Program.Main中:

     

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

   CreateDefaultBuilder 和 ConfigureWebHostDefaults 用通用选项配置了一个宿主,例如如下所示:

  •    使用Kestrel作为一个Web服务器,并启用了IIS集成。
  •    从 appsettings.jsonappsettings.{Environment Name}.json,环境变量,命令行参数,以及其他配置资源加载配置信息。
  •    向控制台以及调试提供器发送日志输出。

   更多信息,请参考.NET Generic Host

   非Web 情形

   Generic Host允许其他类型的App使用横切( cross-cutting)的框架扩展,例如日志,依赖注入,配置,以及app生命周期管理,获取更多信息,请参考 .NET Generic Host 和 Background tasks with hosted services in ASP.NET Core

 服务器

        一个ASP.NET Core app 使用一个HTTP 服务器实现来监听HTTP请求。服务器将对app的请求适配为一些列的请求特性(request features ),它们被包含在一个HttpContext对象中。对于Windows系统来说,ASP.NET Core 提供了如下的服务器实现:

  •        Kestrel是一个跨平台的Web服务器,Kestrel常常被用在使用IIS的反向代理中。在ASP.NET Core 2.0及后续版本中,Kestrel能够以一个面向公共的边界服务器来运行,其可以直接暴漏给因特网。
  •        IIS HTTP服务器是一个使用IIS的面向Windows的服务器。使用这个服务器,ASP.NET Core app 和 IIS在一个进程中运行。
  •       HTTP.sys是一个面向不与IIS一起使用的Windows系统的服务器

      获取更多信息,请参考:Web server implementations in ASP.NET Core

原文地址:https://www.cnblogs.com/qianxingmu/p/12360991.html