asp.net Core 中间件Hello world
虽然在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的更多相关文章
- ASP.NET Core 中间件Diagnostics使用
ASP.NET Core 中间件(Middleware)Diagnostics使用.对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware). Diagnost ...
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- [转]ASP.NET Core 中间件详解及项目实战
本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...
- ASP.NET Core中间件实现分布式 Session
1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件的配置 1.2. 依赖注入中间件 1.3. Cookies ...
- ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...
- ASP.NETCore学习记录(二) —— ASP.NET Core 中间件
ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...
- ASP.NET Core 中间件基本用法
ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件.中间件按照装配的先后顺序执行,并决定是否进入下一个组件.中间件管道的处 ...
- (4)ASP.NET Core 中间件
1.前言 整个HTTP Request请求跟HTTP Response返回结果之间的处理流程是一个请求管道(request pipeline).而中间件(middleware)则是一种装配到请求管道以 ...
- ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 中间件 上一章节中,我们我们有讲到 Startup 类中的 Confi ...
随机推荐
- requests 介绍
一. requests 参数 - method: 提交方式 - url: 提交地址 - params: 在URL中传递的参数,GET - data: 在请求体里传递的数据 - json 在请求体里传 ...
- 欧拉回路&欧拉通路判断
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...
- 开源IDS系列--snorby 进程正常,但是worker无法启动 The Snorby worker is not currently running
设置页面报错: The Snorby worker is not currently running. It's imperative you start the worker immediate ...
- JQuery经典总结
1.jQuery介绍 jQuery是一个js框架(其实就是一个.js文件),它的特点是使用选择器查找要操作的节点,并且将这些节点封装成一个jQuery对象.封装的目的是为了更好地兼容不同的浏览器之间的 ...
- postman自动生成签名
查看详细图文教程↓ 一.全局变量方式 1. 在全局变量添加key:value分别是autoSign和var sign={toUnicode:function(s){return s.replace(/ ...
- CodeForces 909E Coprocessor
题解. 贪心,拓扑排序. 和拓扑排序一样,先把$flag$为$0$的点能删的都删光,露出来的肯定都是$flag$为$0$的,然后疯狂删$flag$为$0$的,这些会使答案加$1$,反复操作就可以了. ...
- POJ 1597 Function Run Fun
记忆化搜索. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- Java_关键字、匿名对象、内部类、访问修饰符、代码块
final关键字 概述: 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后, ...
- CentOS下Supervisor的安装与使用入门
[转载]http://www.51bbo.com/archives/2120 Supervisor是一个进程管理工具,官方的说法 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原 ...
- 选项卡栏控制器(UITabBarController)
选项卡栏控制器管理的每个场景都包含一个UITabBarItem,它包含标题.图像和徽章. 在场景里可以通过tabBarItem属性来获得UITabBarItem的引用.例如:[self.tabBarI ...