[ASP.NET Core] Middleware

前言

本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员。

  • ASP.NET Core官网

结构

  • 在ASP.NET Core里,每个从「浏览器传入」的HTTP Request封包,会被系统封装为「HttpRequest对象」,并且配置默认的HttpResponse对象、Session对象、ClaimsPrincipal对象...等等物件。接着将这些对象,封装成为一个「HttpContext对象」,用来提供ASP.NET Core后续使用。

    frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 521px;">

  • ASP.NET Core在收到HttpContext之后,会把它交给一个「Pipeline」去处理。这个Pipeline里面配置很多「Middleware」。系统会将HttpContext,依序传递给Pipeline里的Middleware去处理。每个Middleware会依照自己内部的程序逻辑,来运算处理HttpContext,并且变更HttpContext所封装的对象内容。

    frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 521px;">

  • ASP.NET Core在收到经由Middleware处理完毕的HttpContext之后,就会取出其中所封装的HttpResponse对象。然后依照这个HttpResponse对象,来建立从「服务器回传」的HTTP Response封包内容。

    frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 519px;">

  • ASP.NET Core经由上述的系统结构,完成HTTP Request封包输入、HTTP Response封包输出的工作流程。

    frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 519px;">

开发

Invoke

在[ASP.NET Core] Getting Started这篇文章里,提供了一个ASP.NET Core的Middleware范例:HelloWorldMiddleware。在这个范例里,Middleware透过实做Invoke方法,来提供自己所封装的程序逻辑。

public class HelloWorldMiddleware
{// Fieldsprivate readonly RequestDelegate _next;// Constructorspublic HelloWorldMiddleware(RequestDelegate next){_next = next;}// Methodspublic Task Invoke(HttpContext context){// Responsecontext.Response.WriteAsync("Hello World!");// Returnreturn Task.CompletedTask;}
}

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 510px;">

HttpContext.Request

在实做Middleware.Invoke方法的时候,开发人员可以透过HttpContext.Request,来取得从「浏览器传入」的HTTP Request封包内容。在下列的范例程序代码里,就是透过HttpContext.Request的Path、QueryString两个属性,来分别取得HTTP Request封包的URL路径与QueryString内容。

public class HelloWorldMiddleware
{// Fieldsprivate readonly RequestDelegate _next;// Constructorspublic HelloWorldMiddleware(RequestDelegate next){_next = next;}// Methodspublic Task Invoke(HttpContext context){// Requeststring path = context.Request.Path.ToString();string queryString = context.Request.QueryString.ToString();string message = string.Format("path={0}, queryString={1}", path, queryString);// Responsecontext.Response.WriteAsync(message);// Returnreturn Task.CompletedTask;}
}

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 510px;">

HttpContext.Response

同样在实做Middleware.Invoke方法的时候,开发人员可以透过HttpContext.Response,来设定从「服务器回传」的HTTP Response封包内容。在下列的范例程序代码里,就是透过HttpContext.Response的WriteAsync方法、StatusCode属性,来分别设定HTTP Response封包的Content与StatusCode。

public class HelloWorldMiddleware
{// Fieldsprivate readonly RequestDelegate _next;// Constructorspublic HelloWorldMiddleware(RequestDelegate next){_next = next;}// Methodspublic Task Invoke(HttpContext context){// Responsecontext.Response.StatusCode = 404;context.Response.WriteAsync("Not Found");// Returnreturn Task.CompletedTask;}
}

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 510px;">

Exception

而在实做Middleware.Invoke方法的时候,如果程序代码里发生了预期之外的Exception。ASP.NET Core预设会使用「500 Internal Server Error」,这个StatusCode来通报系统内部发生异常。 在下列的范例程序代码里,就是直接抛出一个例外错误,交由ASP.NET Core的错误处理机制去处理。

public class HelloWorldMiddleware
{// Fieldsprivate readonly RequestDelegate _next;// Constructorspublic HelloWorldMiddleware(RequestDelegate next){_next = next;}// Methodspublic Task Invoke(HttpContext context){// Exceptionthrow new Exception();// Returnreturn Task.CompletedTask;}
}

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 715px; height: 510px;">

RequestDelegate

建立Middleware的时候,开发人员可以透过建构子所传入的RequestDelegate,来参考到Pipeline里的下一个Middleware。透过调用RequestDelegate,就可以调用Pipeline里的下一个Middleware的Invoke方法。在下列的范例程序代码里,就是透过调用RequestDelegate,来调用Pipeline里的下一个Middleware的Invoke方法,藉此串接其他Middleware的程序逻辑。

public class HelloWorldMiddleware
{// Fieldsprivate readonly RequestDelegate _next;// Constructorspublic HelloWorldMiddleware(RequestDelegate next){_next = next;}// Methodspublic async Task Invoke(HttpContext context){// Do Something 01//....// Nextawait _next.Invoke(context);// Do Something 02// ...}
}

参考

  • Middleware - ASP.NET Core

  • ASP.NET Core 的 Middleware - ASP.NET Core 信息分享

相关文章: 

  • Middleware的艺术

  • dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法

  • ASP.NET Core提供模块化Middleware组件

  • ASP.NET Core 开发-中间件(Middleware)

  • [ASP.NET Core] Static File Middleware

  • 用Middleware给ASP.NET Core Web API添加自己的授权验证


原文地址:http://www.cnblogs.com/clark159/p/5974280.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

2015蓝桥杯省赛---java---C---6(奇妙的数字)

题目描述 思路分析 看到这题目想到的就是 for 循环遍历数字,然后计算它的平方和立方再去判断它们刚好使用0-9这10个数各一次。 代码实现 package com.kuang.study.lanqiao;/*** 创建人 wdl* 创建时间 2021/4/8* 描述*/ public class Main {public static void ma…

MySQL substring()函数

转载自 MySQL substring()函数 在本教程中,我们将向您介绍MySQL SUBSTRING函数从字符串中提取子字符串。 SUBSTRING函数从特定位置开始的字符串返回一个给定长度的子字符串。 MySQL提供了各种形式的子串功能。 我们将在以下部分中检查SUBSTRING函数的每种形式。…

跨平台的.NET邮件协议MailKit组件解析

发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好&am…

2015蓝桥杯省赛---java---C---9(打印大X)

题目描述 思路分析 找规律 代码实现 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int x sc.nextInt();int y sc.nextInt();char [][] arr new char[y][y…

老司机实战Windows Server Docker:1 初体验之各种填坑

前言 Windows Server 2016正式版发布已经有近半年时间了,除了看到携程的同学分享了一些Windows Server Docker的实践经验,网上比较深入的资料,不管是中文或英文的,都还不太多。工作中对Windows Server 2016下的Docker&#xff0c…

.NET Core项目从xproj+project.json向csproj迁移简介

3月7日,微软发布了Visual Studio 2017 RTM,与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0,尽管这些并不是最新版,但也已经从preview版本升级到了正式版。所以,在安装Visual Studio 2017时如果启用…

马踏棋盘算法(骑士周游)+贪心优化

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组,标记棋盘的各个…

MySQL format()函数

转载自 MySQL format()函数 MySQL FORMAT函数简介 有时,您使用表达式或聚合函数(如AVG)来计算数据库中的值,例如库存周转率,产品的平均价格,平均发票值等。 表达式的结果是十进制数,并带有许多小数位。要格式化这…

马踏棋盘算法(骑士周游)

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组,标记棋盘的各个…

开源免费的.NET图像即时处理的组件ImageProcessor

承接以前的组件系列,这个组件系列旨在介绍.NET相关的组件,让大家可以在项目中有一个更好的选择,社区对于第三方插件的介绍还是比较少的,很多博文的内容主要还是介绍一些简单的操作(很多人都说博客园现在是“hello worl…

人脸识别活体检测测试案例

最近好多人找我要关于人脸识别活体检测的案例,今天正好有空我就更新一下,先解释一下活体,顾名思义就是看看是否是活人在测检(大白话解说),用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操…

2016蓝桥杯省赛---java---B---1(有奖猜谜)

题目描述 思路分析 方案一 直接计算器(有手就行的题) 方案二 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int x777;String str"vxvxvxvxvxvxvvx";for (int i 0; i < str.length()…

Linux+Nginx+Asp.net Core部署

上篇《Docker基础入门及示例》文章介绍了Docker部署&#xff0c;以及相关.net core 的打包示例。这篇文章我将以oss.offical.site站点为例&#xff0c;主要介绍下在linux机器下完整的部署流程&#xff0c;.net core在docker容器中的运行已经介绍&#xff0c;这里.net core运行环…

com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。

今天在做项目的时候&#xff0c;使用的jdbc底层增加&#xff0c;然后出现了个问题&#xff0c;找了好久没有找出来是什么问题&#xff0c;后来在网上查了下&#xff0c;发现别人都说是&#xff1f;写成了中文的了&#xff0c;于是我就返回来看&#xff0c;没看出来&#xff0c;…

ps中对齐,历史记录,图层

一、对齐&#xff1a; 1.激活对齐&#xff1a;视图–》对齐 2.新建一个文件&#xff0c;然后置入一张图片&#xff0c;设置一个参考线&#xff0c;使用移动工具进行移动&#xff0c;当移动到参考线附近的时候图片会自己吸到参考线上。 3.移动到参考线的时候如需设置空隙&…

Docker基础入门及示例

Docker近几年的发展可谓一日千里&#xff0c;特别从是2013年随着一个基于LXC的高级容器引擎开源&#xff0c;到现在&#xff0c;其在linux和windows上都有了很好的支持&#xff0c;并且已经有很多公司将docker用于实际的生产环境部署当中。这篇文章我将针对以下几个方面简单介绍…

2016蓝桥杯省赛---java---B---3(平方怪圈)

题目描述 思路分析 代码实现 package com.kuang.study.lanqiao;public class Main {public static void main(String[] args) {int start0;int cnt0;//循环的次数for (int i 2; i < 100; i) {starti;while (cnt<1000){System.out.println(start);String astart"&q…

PS仿制图章工具、油桶工具、渐变

一、仿制图章工具&#xff1a; 1.找到仿制图章工具&#xff0c;或者按快捷键s&#xff0c;选择需要仿制的内容&#xff0c;按住alt,然后找到需要放置的地方&#xff0c;鼠标拖动即可完成仿制。 一、油桶工具&#xff1a; 1.激活&#xff1a;快捷键&#xff1a;G 2.选择需要…

使用 Visual Studio 对源代码文件进行哈希处理以确保文件完整性

对所有编译的软件语言来说&#xff0c;将人类可读代码转换成计算机可读代码都是一项软件保障挑战&#xff1a; 用户如何有信心相信在其计算机上运行的软件程序是根据开发者创建的同一源代码文件生成的呢&#xff1f; 这不一定&#xff0c;即使源代码文件经过行业专家评审&#…

php 输出01,php基础01_thinkphp输出Hello World-Go语言中文社区

用phpstorm和mamp搭建好php开发环境后&#xff0c;就来体验一下thinkPHP的输出过程1.下载thinkphp3.2.3版本框架&#xff0c;将其放入本地主机MyPhp文件夹中thinkphp3.2.3所包含的目录内容如下&#xff1a;目录对应文件为&#xff1a;composer.json:PHP组件的依赖管理器index.p…