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 ...
随机推荐
- DDoS攻击工具
DDoS攻击工具 综合性工具 综合性工具除了可以进行DDoS攻击外,还可用于其他的用途,例如:端口扫描.安全审计.防火墙等.实际上,大部分综合性工具开发的原始目的并不是用于DDoS,而是"网 ...
- 软工个人设计(Java)
一.GitHub的网络地址:https://github.com/qiannai/WC.git 二.PSP图表: PSP2.1 Personal Software Process Stages 预估耗 ...
- dijit/_WidgetBase
英文地址:http://dojotoolkit.org/reference-guide/1.10/dijit/_WidgetBase.html 介绍 dijit/_WidgetBase是Dijit包中 ...
- JVM运行机制(非原创)
文章大纲 JVM基本概念 JVM的体系结构 JVM启动流程 一.JVM基本概念 Java虚拟机(JVM)是可运行Java代码的假想计算机 Java虚拟机包括类加载器.一组寄存器.方法区.一个垃圾回收堆 ...
- jquery设置下拉框selected浏览器兼容方式
今天开发过程中偶然发现一个浏览器兼容性问题 当在某些浏览器下面时使用下面的语法会导致值虽然选中了,但是文本没有切换 var options = $("#select").find( ...
- unittest执行顺序,使用unittest.main()按照test开头,由0-9,A-Z,a-z的顺序执行; 可使用TestSuite类的addTest方法改变执行顺序;
import unittestclass Study(unittest.TestCase): # def setUp(self): # print('start') # def tearDown(se ...
- 关于使用LocalDateTime进行存储,时间相差比较多的问题。
可以在设置数据库中的连接, characterEncoding=UTF8&useSSL=false&serverTimezone=GMT%2b8
- Centos 7 自动安装系统-pxe
一.简介 PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...
- 动态添加Redis密码认证的方法
1.定制jedis 对redis返回的错误的处理,做两处修改: 忽略 (error) ERR Client sent AUTH, but no password is set.使配置了密码的jedis ...
- lstm和gru详解
一.LSTM(长短期记忆网络) LSTM是一种特殊的RNN类型,一般的RNN结构如下图所示,是一种将以往学习的结果应用到当前学习的模型,但是这种一般的RNN存在着许多的弊端.举个例子,如果我们要预测“ ...