ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

来源:互联网 发布:原宿风书包淘宝 编辑:程序博客网 时间:2024/06/01 17:31

在上一节(ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行)中提到ASP.NET Core WebApp 必须含有Startup类,在本节中将重点讲解Startup类以及Middleware(中间件)在Startup类中的使用。

Startup Class

Startup Class中含有两个重要方法:Configure方法用于每次http请求的处理,比如后面要讲的中间件(Middleware),就是在configure方法中配置。而ConfigureServices方法在Configure方法前调用,它是一个可选的方法,可在configureServices依赖注入接口或一些全局的框架,比如EntityFramework、MVC等。Startup 类的 执行顺序:构造 -> configureServices->configure

1、Startup Constructor(构造函数)

主要实现一些配置的工作,方法参数如下:

  • IHostingEnvironment: 用于访问应用程序的特殊属性,比如applicationName,applicationVersion。通过IHostingEnvironment对象下的属性可以在构造中实现配置工作。比如获取当前根路径找到配置json文件地址,然后ConfigurationBuilder初始化配置文件,最后可以通过GetSection()方法获取配置文件。代码清单如下:

var builder = new ConfigurationBuilder()                            .SetBasePath(env.ContentRootPath)                             .AddJsonFile("appsettings.json");                     var configuration = builder.Build();                     var connStr = configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;

根目录下的配置文件如下:

{    "Data": {        "DefaultConnection": {            "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;"        }    }}
  • ILoggerFactory: 提供创建日志的接口,可以选用已经实现接口的类或自行实现此接口,下面代码使用最简单的控制台作为日志输出。

public Startup(IHostingEnvironment env, ILoggerFactory logger) {         var log = logger.CreateLogger("default");         logger.AddConsole();         log.LogInformation("start configure"); }

2、ConfigureServices

主要实现了依赖注入(DI)的配置,方法参数如下:

  • IServiceCollection:整个ASP.NET Core 默认带有依赖注入(DI),IServiceCollection是依赖注入的容器,首先创建一个类(Foo)和接口(IFoo),代码清单如下:

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace WebApplication1{   public interface IFoo    {        string GetFoo();    }}
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace WebApplication1{    public class Foo : IFoo    {        public string GetFoo()        {            return "foo";        }    }}

在ConfigureServices 中将接口和实现注入至容器

public void ConfigureServices(IServiceCollection services)       {           services.AddTransient<IFoo, Foo>();       }

如果想在每次Http请求后都使用IFoo的GetFoo()方法来处理,上面讲到可以在Configure方法中注册函数,在注册过程中由于使用了依赖注入(DI),因此可以直接通过RequestServices.GetRequiredService<IFoo>()泛型方法将IFoo对象在容器中取出。

app.Run((context) =>           {               var str = context.RequestServices.GetRequiredService<IFoo>().GetFoo();               return context.Response.WriteAsync(str);           });

除了自己的接口外,还支持通过扩展方法添加更多的注入方法,比如EntityFramework、mvc框架都实现自己的添加方法。

public void ConfigureServices(IServiceCollection services){    // Add framework services.    services.AddDbContext<ApplicationDbContext>(options =>        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));    services.AddIdentity<ApplicationUser, IdentityRole>()        .AddEntityFrameworkStores<ApplicationDbContext>()        .AddDefaultTokenProviders();    services.AddMvc();    // Add application services.     services.AddTransient<IFoo, Foo>();}

3、Configure方法

主要是http处理管道配置和一些系统配置,参数如下:

  • IApplicationBuilder: 用于构建应用请求管道。通过IApplicationBuilder下的run方法传入管道处理方法。这是最常用方法,对于一个真实环境的应用基本上都需要比如权限验证、跨域、异常处理等。下面代码调用IApplicationBuilder.Run方法注册处理函数。拦截每个http请求,输出Hello World。

public void Configure(IApplicationBuilder app){    app.Run((context) => context.Response.WriteAsync("Hello World!"));}
  • IHostingEnvironment: 同构造参数

  • ILoggerFactory: 同构造参数

Middleware

中间件是一个处理http请求和响应的组件,多个中间件构成了处理管道(Handler pipeline),每个中间件可以决定是否传递至管道中的下一中间件。一旦注册中间件后,每次请求和响应均会被调用。

1、中间件注册

中间件的注册在startup中的Configure方法完成,在configure方法中使用IApplicationBuilder对象的Run、Map、Use方法传入匿名委托(delegate)。上文示例注册IFoo.GetFoo()方法就是一个典型的中间件。

  • Run & Use: 添加一个中间件至请求管道。它们在功能很类似但是也存在一些区别,先来看下两个方法的定义。

 public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware); public static void Run(this IApplicationBuilder app, RequestDelegate handler);

Run是通过扩展方法语法来定义,传入入参是RequestDelegate的委托,执行完一个第一个run后是不会激活管道中的第二个run方法,这样代码执行结果只会输出一个“hello world!”

app.Run((context) => context.Response.WriteAsync("Hello World!"));app.Run((context) => context.Response.WriteAsync("Hello World 1!"));

而use方法的入参则是Func<>的委托包含两个入参和一个返回值,这样在第一个函数执行完成后可以选择是否继续执行后续管道中的中间件还是中断。

app.Use((context, next) =>                     {                             context.Response.WriteAsync("ok");                             return next();                     });app.Use((context, next) =>                     {                             return context.Response.WriteAsync("ok");                     });

  • Map: 含有两个参数pathMatche和configuration,通过请求的url地址匹配相应的configuration。例如可以将url路径是/admin的处理函数指定为如下代码:

app.Map("/admin", builder =>                    {                            builder.Use((context, next) => context.Response.WriteAsync("admin"));                    });

2、常用中间件

Middleware 功能描述 Authentication 提供权限支持 CORS 跨域的配置 Routing 配置http请求路由 Session 管理用户会话 Static Files 提供对静态文件的浏览

这里有一些官方的示例,链接


以上内容有任何错误或不准确的地方请大家指正,不喜勿喷!

作者:帅虫哥 出处: http://www.cnblogs.com/vipyoumay/p/5640645.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

参考链接

[1] https://docs.asp.net/en/latest/fundamentals/middleware.html

[2] http://www.talkingdotnet.com/app-use-vs-app-run-asp-net-core-middleware/

相关文章:

  • ASP.NET Core 1.0 入门——了解一个空项目

  • ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

  • .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

  • 云服务器下ASP.NET Core 1.0环境搭建(包含mono与coreclr)

  • 使用VS Code开发ASP.NET Core 应用程序

  • dotnet run是如何启动asp.net core站点的

  • ASP.NET Core提供模块化Middleware组件

  • “dotnet restore"和"dotnet run"都做了些什么?

  • 探秘 dotnet run 如何运行 .NET Core 应用程序

  • .NET Portability Analyzer 已开源

  • ASP.NET Core的配置(1):读取配置信息

  • ASP.NET Core的配置(2):配置模型详解

  • .NET Core 1.0 RC2 历险之旅

  • 使用VS Code开发 调试.NET Core 应用程序

  • 让我们Core在一起:ASP.NET Core & .NET Core

  • .NET Core VS Code 环境配置

  • 官方博客明确了 .NET Core RC2/RTM 时间表

  • .NET Core全新的配置管理[共9篇]

  • 利用记事本创建一个ASP.NET Core RC2 MVC应用

  • 微软.NET 正式劈腿成功,横跨所有平台

  • .NET Core 1.0 CentOS7 尝试

  • 解读发布:.NET Core RC2 and .NET Core SDK Preview 1

  • [.NET Core].NET Core R2安装及示例教程

  • ASP.NET Core 开发-中间件(Middleware)

  • 结合Jexus + Kestrel 部署 asp.net core 生产环境

  • 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

  • ASP.NET Core 中文文档 第一章 入门

  • 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

  • 用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

  • 用 Visual Studio 发布一个 Azure 云 Web 应用程序

  • ASP.NET Core MVC 与 Visual Studio 入门

  • 第二章指南(4.2)添加 Controller

  • DotNet Core 介绍

  • asp.net core 中间件详解及项目实战

  • 教你实践ASP.NET Core Authorization(免看文档教程)

  • asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存

  • asp.net core 中间件详解及项目实战

  • 第二章 指南(4.3)添加 View

  • dotnet core开发体验之开始MVC

  • dotnet core 开发体验之Routing

  • 聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

  • 简析.NET Core 以及与 .NET Framework的关系

  • .NET Core 使用Dapper 操作MySQL

  • 使用 CommandLineApplication 类创建专业的控制台程序

  • 简析 .NET Core 构成体系

  • .NET Core也可以使用MongoDB了

  • .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

  • .NET Core:面向未来的开源跨平台开发技术

  • 微软说它深爱着Linux,现在它用行动证明了

  • 移植.NET Core计划,整合各平台变得更简单了!

  • ASP.NET Core 介绍

  • 通过几个Hello World感受.NET Core全新的开发体验

  • ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

  • .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

  • Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

  • Asp.Net Core 发布和部署(Linux + Jexus )

  • 学习ASP.NET Core,你必须了解无处不在的“依赖注入”

  • .NET Core应用类型(Portable apps & Self-contained apps)

原文地址:http://www.cnblogs.com/vipyoumay/p/5640645.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

阅读全文
0 0
原创粉丝点击