[ASP.NET Core] Middleware
2018-06-22 07:38:28来源:未知 阅读 ()
前言
本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员。
- ASP.NET Core官网
结构
-
在ASP.NET Core里,每个从「浏览器传入」的HTTP Request封包,会被系统封装为「HttpRequest对象」,并且配置默认的HttpResponse对象、Session对象、ClaimsPrincipal对象...等等物件。接着将这些对象,封装成为一个「HttpContext对象」,用来提供ASP.NET Core后续使用。
-
ASP.NET Core在收到HttpContext之后,会把它交给一个「Pipeline」去处理。这个Pipeline里面配置很多「Middleware」。系统会将HttpContext,依序传递给Pipeline里的Middleware去处理。每个Middleware会依照自己内部的程序逻辑,来运算处理HttpContext,并且变更HttpContext所封装的对象内容。
-
ASP.NET Core在收到经由Middleware处理完毕的HttpContext之后,就会取出其中所封装的HttpResponse对象。然后依照这个HttpResponse对象,来建立从「服务器回传」的HTTP Response封包内容。
-
ASP.NET Core经由上述的系统结构,完成HTTP Request封包输入、HTTP Response封包输出的工作流程。
开发
Invoke
在[ASP.NET Core] Getting Started这篇文章里,提供了一个ASP.NET Core的Middleware范例:HelloWorldMiddleware。在这个范例里,Middleware透过实做Invoke方法,来提供自己所封装的程序逻辑。
public class HelloWorldMiddleware
{
// Fields
private readonly RequestDelegate _next;
// Constructors
public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
}
// Methods
public Task Invoke(HttpContext context)
{
// Response
context.Response.WriteAsync("Hello World!");
// Return
return Task.CompletedTask;
}
}
HttpContext.Request
在实做Middleware.Invoke方法的时候,开发人员可以透过HttpContext.Request,来取得从「浏览器传入」的HTTP Request封包内容。在下列的范例程序代码里,就是透过HttpContext.Request的Path、QueryString两个属性,来分别取得HTTP Request封包的URL路径与QueryString内容。
public class HelloWorldMiddleware
{
// Fields
private readonly RequestDelegate _next;
// Constructors
public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
}
// Methods
public Task Invoke(HttpContext context)
{
// Request
string path = context.Request.Path.ToString();
string queryString = context.Request.QueryString.ToString();
string message = string.Format("path={0}, queryString={1}", path, queryString);
// Response
context.Response.WriteAsync(message);
// Return
return Task.CompletedTask;
}
}
HttpContext.Response
同样在实做Middleware.Invoke方法的时候,开发人员可以透过HttpContext.Response,来设定从「服务器回传」的HTTP Response封包内容。在下列的范例程序代码里,就是透过HttpContext.Response的WriteAsync方法、StatusCode属性,来分别设定HTTP Response封包的Content与StatusCode。
public class HelloWorldMiddleware
{
// Fields
private readonly RequestDelegate _next;
// Constructors
public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
}
// Methods
public Task Invoke(HttpContext context)
{
// Response
context.Response.StatusCode = 404;
context.Response.WriteAsync("Not Found");
// Return
return Task.CompletedTask;
}
}
Exception
而在实做Middleware.Invoke方法的时候,如果程序代码里发生了预期之外的Exception。ASP.NET Core预设会使用「500 Internal Server Error」,这个StatusCode来通报系统内部发生异常。 在下列的范例程序代码里,就是直接抛出一个例外错误,交由ASP.NET Core的错误处理机制去处理。
public class HelloWorldMiddleware
{
// Fields
private readonly RequestDelegate _next;
// Constructors
public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
}
// Methods
public Task Invoke(HttpContext context)
{
// Exception
throw new Exception();
// Return
return Task.CompletedTask;
}
}
RequestDelegate
建立Middleware的时候,开发人员可以透过建构子所传入的RequestDelegate,来参考到Pipeline里的下一个Middleware。透过调用RequestDelegate,就可以调用Pipeline里的下一个Middleware的Invoke方法。在下列的范例程序代码里,就是透过调用RequestDelegate,来调用Pipeline里的下一个Middleware的Invoke方法,藉此串接其他Middleware的程序逻辑。
public class HelloWorldMiddleware
{
// Fields
private readonly RequestDelegate _next;
// Constructors
public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
}
// Methods
public async Task Invoke(HttpContext context)
{
// Do Something 01
//....
// Next
await _next.Invoke(context);
// Do Something 02
// ...
}
}
参考
-
Middleware - ASP.NET Core
-
ASP.NET Core 的 Middleware - ASP.NET Core 信息分享
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net源程序编译为dll文件并调用的实现过程 2020-03-29
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用Ajax返回Json对象的方法 2020-03-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash