在ASP.NET Core中编写合格的中间件

  这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道。所有ASP.NET Core应用程序至少需要一个中间件来响应请求,并且您的应用程序实际上只是中间件的集合。当然MVC管道本身就是中间件,早在WebForm时代就出现过HttpModules、HttpHandler、那个时候悠然记得我通过它们来组织我的广告系统,不闲扯我们继续。

  每个中间件组件都有一个带有HttpContext参数的Invoke方法。您可以使用这个参数来处理方法。

public async Task Invoke(HttpContext context)
{
if (context.Request.Path...)
{
await context.Response.WriteAsync("writing text...");
}
}

   应用程序中最顶层的中间件将始终针对每个请求被调用。这是由.NET框架自动完成的。中间件可以向客户端发送响应,也可以调用下一个中间件。对于后一种选择,它当然需要访问下一个中间件组件。这就是为什么大多数中间件组件都是使用带有RequestDelegate参数的构造函数定义的。总之,RequestDelegate会自动填充,您无需在意。

   中间件在Startup.cs的Configure方法中注册。Configure方法具有IApplicationBuilder参数,该参数提供了所有类型的中间件注册所需的方法,我们试着去编写一个中间件。

public class MyCustomMiddleware
{
private readonly RequestDelegate _next;
public MyCustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context, IWebHostEnvironment env)
{
context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet";
context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet";
await _next(context);
}
}

随后我们在Startup.cs的Configure方法中通过 use 来注册自定义中间件。

public void Configure(IApplicationBuilder app, ...)
{
app.UseMyCustomMiddleware();
}

  启动程序我们发现一些正常,我们得到了我们想要的效果。

 640?wx_fmt=png

  但实际上,您很少需要直接调用UseMiddleware,因为中间件作者的标准方法是编写特定于所注册中间件的扩展方法:

using MiddlerWareSolucation.MiddlerWare;
using Microsoft.AspNetCore.Builder;

namespace MiddlerWareSolucation.MiddlerWare_Extensions
{
public static class MyCustomMiddlewareExtensions
{
public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<MyCustomMiddleware>();

return app;
}
}
}

随后直接调用Extensions扩展方法,效果还是一样的。

public void Configure(IApplicationBuilder app, ...)
{
app.UseMyCustomMiddleware();
}

 部分时候我们想要通过客户端请求的路径来对我们的中间件进行启动,当然 MapWhen 允许您通过指定谓词将中间件管道分成两个完全独立的分支:

app.UseMiddlewareOne();

app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseMiddlewareTwo();
});

app.UseMiddlewareThree();

在此示例中,中间件One将始终执行,如果请求路径以“ / api”开头,则将执行中间件Two。否则,将执行中间件Three。使用这种配置,中间件2和中间件3都无法针对单个请求执行。

我想说的是最后一种情况是,您希望大多数中间件针对所有请求运行,但是您有一些条件件-特定中间件仅应针对某些请求运行。

这可以通过UseWhen轻松实现,UseWhen还使用谓词来确定中间件是否应该运行:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");

appBuilder.UseExceptionHandler("/apierror/500");
});

这样就可以通过选择注册方式来自己控制中间件。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvcc找不到的问题(Ubuntu16.04 CUDA 8.0)

http://blog.csdn.net/rtygbwwwerr/article/details/73656876在terminal中输入nvcc&#xff0c;也是提示找不到command。但是可以确定的是&#xff0c;CUDA8.0&#xff0c;以及nvidia-cuda-toolkit已经从官方网站下载并正确安装。 于是网上找了教程&#xff0c;说是需要在termi…

全网首发 PowerBI 秒级实时大屏通用解决方案

双十一来了&#xff0c;你准备好了吗&#xff1f;不管你是否准备完毕&#xff0c;我们带来了全网首发的 PowerBI 秒级实时大屏展示方案&#xff0c;你可以直接用来展示双十一的实时状况。我们一步步来说明这个套件模板教程。真实效果功能如下&#xff1a;全实时展示 双十一 当天…

windows 编译 caffe unresolved externals 问题

windows 10 编译基于 caffe 的工程&#xff0c; 由于github上作者所用到的版本各不相同&#xff0c;版本是导致问题的根本。 遇到 LNK20xx error unresolved externals&#xff0c;先找是哪个.obj 造成的&#xff0c; 这种link问题是由声明不正确造成的&#xff0c;我们找到那个…

普大喜奔 | Azure 免费送网站SSL证书啦!

点击上方蓝字关注“汪宇杰博客”导语就在今晨&#xff0c;微软推出了 App Service Managed Certificates 预览版。简单来说&#xff0c;这就是在 Azure App Service 服务的一项更新&#xff0c;免费送你SSL证书&#xff01;只要点几下鼠标就能给网站加上SSL证书&#xff01;并且…

VS Code 1.40 发布!可自行搭建 Web 版 VS Code!

今天&#xff08;北京时间 2019 年 11 月 8 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.40 版本。让我们来看看有哪些主要的更新。自建 Web 版 VS Code 如果你已经下载了 VS Code 在 GitHub 上的源代码&#xff0c;只需运行 yarn web&#xff0c;就能在 http:…

Visual Studio 2013 error MS8020 Build tools v140 cannot be found 解决系统 不同部分软件 所依赖编译器版本不同的矛盾

系统中一部分软件依赖VS 2013&#xff0c;另一部分依赖VS2015&#xff0c; 我们需要修改其中任一部分的编译器选项 https://stackoverflow.com/questions/31792663/visual-studio-2013-error-ms8020-build-tools-v140-cannot-be-foundTo change your Platform Toolset: Right c…

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本前言上一篇自动化测试&#xff0c;全面且详细的介绍了从零开始到发布版本的步骤&#xff0c;这是传统的方式&#xff0c;本次为大家带来的是如何在5分钟内使用上docker进行CI/CD&#xff0c;毕竟现在的容器化如火如荼&am…

ImportError: No module named google.protobuf.internal

conda install -c distributions libprotobuf2.5.0 or sudo apt-get install protobuf

.NET Core 又一杀器! Web Blazor框架横空出世!

多年来&#xff0c;Javascript&#xff08;及其子框架&#xff09;已在浏览器中运行DOM&#xff08;文档对象模型&#xff09;&#xff0c;并且掌握了脚本知识才能真正操作客户端UI。大约2年前&#xff0c;所有这些都随着Web Assembly的引入而发生了变化-Web Assembly允许在客户…

./include/caffe/util/cudnn.hpp: error: too few arguments to function ‘SetPooling2dDescriptor

https://blog.csdn.net/tianrolin/article/details/71246472 这是由于所使用的cuDNN版本不一致的导致的&#xff0c;作者配置环境是cuDNN 4.0&#xff0c;但是5.0版本后的cuDNN接口有所变化。 解决方法 &#xff1a;将以下几个文件用最新BVLC版本的caffe对应文件替换并重新编译…

.NET Conf 2019 今天在上海开幕,图片直播地址

.NET Conf 2019 在上海开幕&#xff0c;全程提供图片直播&#xff1a;https://vzan.com/live/tvchat-1099246581下午的分会场内容如下&#xff1a;上午有个直播 &#xff0c;请阅读原文访问https://vzan.com/live/tvchat-1099246581 。

NPOI 导出 excel 性能测试

NPOI 导出 excel 性能测试Intro网上看到很多人说 NPOI 的性能不行&#xff0c;自己写了一个 NPOI 的扩展库&#xff0c;于是想尝试看看 NPOI 的性能究竟怎么样&#xff0c;道听途说始终不如自己动手一试。测试环境测试工具&#xff1a;BenchmarkDotNet v0.11.5EPPlus.Core.Exte…

caffe安装常见问题

https://blog.csdn.net/u012576214/article/details/68947893解决办法是依据出现错误的顺序而给出的&#xff0c;为了方便&#xff0c;可以直接先执行所有解决办法后再安装caffe。 1. ./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: No such file or directo…

Asp.Net Core 单元测试正确姿势

背景ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式&#xff0c;并且默认注入了很多服务&#xff0c;具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学&#xff0c;都会对此有不同深入的理解&#xff0c;在此无需赘言。然而&#xff0c;在引入 IOC 框架之后&#x…

ubuntu 通过 海康sdk调用摄像头抓图片

https://blog.csdn.net/ding977921830/article/details/75272384 在本文中我的电脑是使用的Ubuntu16.04 64位&#xff0c;使用工具是QT5.7.1&#xff0c;opencv2.4.9.一、根据电脑的型号下载海康威视的SDK包网址&#xff1a;http://www.hikvision.com/cn/download_61.html。我的…

程序员与「中台」的爱恨交错

大家好&#xff0c;我是Z哥。这篇文章比较长&#xff0c;有5200字&#xff0c;不过希望你能耐心看完&#xff0c;特别是程序员。中台这个词&#xff0c;最近两年特别火&#xff0c;它的爆发源于2015年张勇在阿里发出的内部信中提到的“大中台&#xff0c;小前台”战略。随后吸引…

ubuntu 文件管理器死机

有时会遇到Ubuntu文件管理器死掉的情况&#xff0c;怎么点击都没有反应&#xff0c;这时只需在终端上运行ps -A | grep nautilus&#xff0c;查找文件管理器nautilus对应的pid,然后sudokillpid就可以关闭文件管理器进程&#xff0c;随便点击一个文件夹就可以重启文件管理器了。…

「云」发展的怎么样了?

周五发了一篇聊中台的文章&#xff0c;《》。有小伙伴给我留言问到&#xff0c;身边好像直接基于「云」做开发的人和企业越来越多了&#xff0c;如何看待「云」的渗透率逐渐走高对我们技术人的影响。对于这点我的观点是&#xff0c;一件事情分工越来越细是我们整个社会向前发展…