ASP.NET Core系列:中间件
1. 概述
ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码。
2. 使用 IApplicationBuilder 创建中间件管道
2.1 匿名函数
使用Run, Map, Use ,MapWhen等扩展方法来实现。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
第一个Run委托终止了管道。
用 Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
context.Response.ContentType = "text/plain;charset=utf-8"; await context.Response.WriteAsync("进入第一个委托 执行下一个委托之前\r\n"); // 调用管道中的下一个委托
await next.Invoke(); await context.Response.WriteAsync("结束第一个委托 执行下一个委托之后\r\n");
}); app.Run(async context =>
{
await context.Response.WriteAsync("进入第二个委托\r\n"); await context.Response.WriteAsync("Hello World!\r\n"); await context.Response.WriteAsync("结束第二个委托\r\n");
});
}
2.2 自定义中间件类
新建中间件类:MyMiddleware.cs
using Microsoft.AspNetCore.Http; public class MyMiddleware
{
private readonly RequestDelegate _next; // 在应用程序的生命周期中,中间件的构造函数只会被调用一次
public MyMiddleware(RequestDelegate next)
{
this._next = next;
} public async Task InvokeAsync(HttpContext context)
{
await context.Response.WriteAsync("Hello World!"); await _next(context);
}
}
将自定义中间件配置到请求处理管道中,Startup.cs文件调整:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<MyMiddleware>();
}
将中间件MyMiddleware改成扩展方法:
新建扩展类MyMiddlewareExtension.cs
using Microsoft.AspNetCore.Builder; public static class MyMiddlewareExtension
{
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
{
// 使用UseMiddleware将自定义中间件添加到请求处理管道中
return builder.UseMiddleware<MyMiddleware>();
}
}
将自定义中间件配置到请求处理管道中,Startup.cs文件调整:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMyMiddleware();
}
2.3 自定义中间件类传入初始参数
public class GreetingOption
{
public string At { get; set; } public string To { get; set; }
}
using Microsoft.AspNetCore.Http; public class GreetingMiddleware
{
private readonly RequestDelegate _next;
private readonly GreetingOption _option; public GreetingMiddleware(RequestDelegate next, GreetingOption option)
{
_next = next;
_option = option;
} public async Task Invoke(HttpContext context)
{
var message = $"Good {_option.At} {_option.To}";
await context.Response.WriteAsync(message);
}
}
using Microsoft.AspNetCore.Builder; public static class GreetingMiddlewareExtension
{
public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app, GreetingOption option)
{
return app.UseMiddleware<GreetingMiddleware>(option);
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseGreetingMiddleware(new GreetingOption
{
At = "Morning",
To = "Libing"
});
}
3. IMiddleware
IMiddleware提供了强类型约束的中间件,其默认实现是MiddlewareFactory,接口定义如下:
public interface IMiddleware
{
Task InvokeAsync(HttpContext context, RequestDelegate next);
}
IMiddlewareFactory用于创建IMiddleware实例及对实例进行回收,接口定义:
public interface IMiddlewareFactory
{
public IMiddleware Create (Type middlewareType); public void Release (IMiddleware middleware);
}
3.1 自定义IMiddleware类型中间件
修改MyMiddleware,实现IMiddleware接口:
using Microsoft.AspNetCore.Http; public class MyMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
await context.Response.WriteAsync("Hello World!"); await next(context);
}
}
将自定义中间件配置到请求处理管道中,Startup.cs文件调整:
public void ConfigureServices(IServiceCollection services)
{
// 在服务容器中注册自定义中间件
services.AddSingleton<MyMiddleware>();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 使用 UseMiddleware() 把自定义中间件添加到管道中
app.UseMyMiddleware();
}
ASP.NET Core系列:中间件的更多相关文章
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- asp.net core 系列 14 错误处理
一.概述 本文介绍处理 ASP.NET Core 应用中常见错误的一些方法.主要是关于:开发环境异常页:非开发环境配置自定义异常处理页:配置状态代码页(没有正文响应,http状态400~599的). ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- ASP.NET Core系列(二):创建第一个.Net Core 项目
前面讲过 .NET Core简介及开发环境安装,本章会讲一讲ASP.NET Core 2.0的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zh ...
- ASP.NET Core系列(三):启动类Startup
前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...
- Asp.net Core 系列之--4.事务、日志及错误处理
ChuanGoing 2019-11-17 这篇原本时想把事务处理.日志处理.错误处理.授权于鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介 ...
- Asp.net Core 系列之--5.认证、授权与自定义权限的实现
ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...
- Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)
Ajax跨域问题及解决方案 目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
随机推荐
- Spinner在Dialog中的使用效果
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/91 背景: 记得很久以前,碰到一个需求场景,需要在Andr ...
- 仓库管理移动应用解决方案——C#开发的移动应用开源解决方案
产品简介 SmoWMS是一款仓库管理移动解决方案,通过Smobiler平台开发,包含了仓库管理中基础的入库.出库.订单管理.调拨.盘点.报表等功能.支持扫码条码扫描.RFID扫描等仓库中常见的场景. ...
- NDK简介
一.NDK简介: C/C++的动态库.Dalvik通过JNI编程方式调用C/C++代码. NDK编程提高软件性能,加密保护APK文件 ndk-build NDK编译生成脚本 Java编译 ...
- LeetCode——Department Top Three Salaries(巧妙使用子查询)
The Employee table holds all employees. Every employee has an Id, and there is also a column for the ...
- Python—实现ssl认证
https://blog.csdn.net/vip97yigang/article/details/84721027 https://www.cnblogs.com/lsdb/p/9397530.ht ...
- Day_03
1.指针基本操作 package main import "fmt" func main() { var a int //每个变量有2层含义:变量的内存,变量的地址 fmt.Pri ...
- xcode静态库调试
[工程1]:静态库工程,用来生成xxx.a [工程2]:项目工程,需要引入静态库xxx.a 工程2引入静态库的方法是将工程1生成的xxx.a和include头文件目录,加入到工程2中. 而如果需要在工 ...
- SQL Server 创建 修改 删除数据表
1. 图形界面方式操作数据表 (1)创建和修改数据表 列名中如果有两个以上单词时,最好用下划线连接,否则可能会给将来的查询维护带来不便.我们公司美国佬做的数据库就很烦,所有列名都有空格,一旦忘记用方括 ...
- Java的 StringBuffer 和 StringBuilder 类
https://www.runoob.com/java/java-stringbuffer.html 返回值是它本身的类, 所以可以链式调用! 总结就是可以直接在对象上使用 , 可以链式使用, buf ...
- Azure EA (2) 使用Postman访问国内Azure Billing API
<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 请读者先看一下之前的文档内容:Azure EA (1) 查看国内Az ...