虽然在ASP.NET 5中,微软没有再强调OWIN(Open Web Interface for .NET)及其微软官方的OWIN实现Katana,但是其中涉及到一些原则和设计思想依然被ASP.NET 5以自己的方式所承载下来。比如,解耦服务器和应用程序的关系,应用程序委托,环境状态这些特性都能在ASP.NET 5中找到,且进行了更多加强。

那么什么是“中间件”呢?OWIN的规范中如此定义:“中间件即是在服务器和应用程序之间的管道传入的一些组件,为了特定目的监测、路由或编辑请求和回应消息。”这样的定义对于ASP.NET 5同样适用,或者可以被认为就是传统ASP.NET中的HTTP模块和处理器。某些中间件会完成一些中间任务,比如处理请求的验证、会话状态获取和持久保持、日志记录诸如此类;有一些中间件会最终生成回应消息。

要编写ASP.NET 5的中间件,有一种非常简单的方式,一段Lambda表达式就可以搞定:

public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Hello ASP.NET 5!");
});
}
}

在上述代码中,传递给IApplicationBuilder.Run方法的是一个委托:RequestDelegate,其定义如下:

public delegate Task RequestDelegate(HttpContext context);

RequestDelegate等效于OWIN中的AppFunc。其接受状态信息HttpContext作为输入参数,返回一个Task。注意,此HttpContext非SystemWeb中的HttpContext,这是封装请求处理状态且对服务器透明(不特定于某种服务器)的上下文状态对象。而返回Task可以让调用者能够等待你的中间件完成工作后才进行后续任务执行。Run方法还有多个重载,以便让你注入相关依赖。

RequestDelegate同样也可以用于把中间件串接到执行管道中:

public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(next => async context =>
{
// do your stuff here before calling the next middleware
// in the pipeline await next.Invoke(context); // call the next guy // do some more stuff here as the call is unwinding
}); app.Run(async context =>
{
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Hello ASP.NET 5!");
});
}
}

通过使用IApplicationBuilder.Use方法就可以把自己的中间件代码串到其他中间件的前面。其中next这个参数,就是下一个中间件的实例。其方法定义如下:

IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate

上面是用Lambda表达式来实现中间件,不过在实际开发当中涉及的代码都比较庞杂,所以最好是放到一个单独的类当中,并提供相应的测试代码。这样你可以单独编译打包分发这个中间件。文章作者Andrei Dzimchuk以实现HTTP Basic验证的一个简单中间件为例给出了如下代码:

public class BasicAuthentication
{
private readonly RequestDelegate next; public BasicAuthentication(RequestDelegate next)
{
this.next = next;
} public async Task Invoke(HttpContext context,
IAuthenticationService authenticationService)
{
try
{
var parser = new BasicAuthenticationParser(context);
var username = parser.GetUsername();
var password = parser.GetPassword(); await authenticationService.AuthenticateAsync(username, password);
await next(context);
}
catch (InvalidCredentialsException)
{
context.Response.StatusCode = 401;
context.Response.Headers.Add("WWW-Authenticate",
new[] { "Basic" });
}
}
}

这个类非常有意思。首先让我们非常奇怪的是,它没有继承任何基类或者实现任何接口。由此可知,微软开始在ASP.NET 5中推崇“约定胜于接口”的思想。我们只要实现一个接受RequestDelegate为参数的构造器,和一个方法签名同RequestDelegate一致的Invoke方法。当然本例中Invoke还接受了另外一个参数,这就是第二个奇怪的地方,我们能够在中间件里直接使用依赖注入。本例中就是注入了一个IAuthenticationService。

要使用编写好的中间件也是非常简单。首先引用一个依赖包“Microsoft.AspNet.RequestContainer ”,然后就可以使用Microsoft.AspNet.Http.Extensions的扩展方法IApplicationBuilder.UseMiddleware来加载中间件,如下:

builder.UseMiddleware<BasicAuthentication>();

通常,我们会把单独编写一个扩展类,来提供一个语义根据明确的扩展方法。最终Startup文件就可以编写为:

public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseBasicAuthentication(); app.Run(async context =>
{
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Hello ASP.NET 5!");
});
}
}

到此,我们就完成了中间件的编写和使用。当然还需要完成注册IAuthenticationService这样的代码,这个就涉及到ASP.NET 5的依赖注入特性,有机会下次介绍。

asp.net Core 中间件Hello world的更多相关文章

  1. ASP.NET Core 中间件Diagnostics使用

    ASP.NET Core 中间件(Middleware)Diagnostics使用.对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware). Diagnost ...

  2. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  3. [转]ASP.NET Core 中间件详解及项目实战

    本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...

  4. 如何一秒钟从头构建一个 ASP.NET Core 中间件

    前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...

  5. ASP.NET Core中间件实现分布式 Session

    1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件的配置 1.2. 依赖注入中间件 1.3. Cookies ...

  6. ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

  7. ASP.NETCore学习记录(二) —— ASP.NET Core 中间件

    ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...

  8. ASP.NET Core 中间件基本用法

    ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件.中间件按照装配的先后顺序执行,并决定是否进入下一个组件.中间件管道的处 ...

  9. (4)ASP.NET Core 中间件

    1.前言 整个HTTP Request请求跟HTTP Response返回结果之间的处理流程是一个请求管道(request pipeline).而中间件(middleware)则是一种装配到请求管道以 ...

  10. ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 中间件 上一章节中,我们我们有讲到 Startup 类中的 Confi ...

随机推荐

  1. hdu 4726(贪心)

    Kia's Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. sharepoint2013搜索

    参考http://www.cnblogs.com/jianyus/p/3272692.html 最小权限http://www.cnblogs.com/awpatp/archive/2011/08/16 ...

  3. Maven_pom文件常用

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 安装 jupyter notebook 出现 ModuleNotFoundError: No module named 'markupsafe._compat' 错误

    使用 python -m pip install jupyter 安装完成 jupyter notebook 之后,在命令行界面输入 "jupyter notebook "指令打开 ...

  5. python ConfigParser 配置读写

    我们写程序的时候一般都会写程序包的时候,很少硬编码写在一起,这有个很好的配置文件包. 参考 ConfigParser  和   ConfigParser 的使用 一.ConfigParser 简介 C ...

  6. Linux下rsync的用法

    一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync” ...

  7. loadrunner中大小写字符转换函数封装:

    //封装ConvertToXXX函数: int ConvertToUpper(char * sInput, char * sNew) { sInput = (char *)strupr(sInput) ...

  8. openssl asn.1 生成DER文件,把DER文件转换成内部数据结构

    1 在实现之前,先来介绍如何生成der文件,有了源数据才能进行验证和测试.生成的方法是使用在openssl的命令中使用*asn1parse*根据配置文件来生成.详情如下: 1.1 创建配置文件test ...

  9. HashMap碰撞问题

    HashMap是最常用的集合类框架之一,它实现了Map接口,所以存储的元素也是键值对映射的结构,并允许使用null值和null键,其内元素是无序的,如果要保证有序,可以使用LinkedHashMap. ...

  10. Java反射机制demo(一)—实例化Class对象,并获得其他类包名和类型

    Java反射机制demo(一)——实例化Class对象,通过对象获得包名和类型 使用Java中的 本地类作为实验对象,避免自定义的类带来的一些不便. public static void main(S ...