问题
如何创建最简单的ASP.NET核心中间件?
回答
使用VS创建一个ASP.NET核心2.0的空项目,注意Startup.cs中的Configure()方法:
public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。run(async(context)={ wait context。回应. WriteAsync('Hello World!(Run)');});}创建请求管道的更好方法是使用IApplicationBuilder上的扩展方法:
public static void RunHelloWorld(此IApplicationBuilder应用){ app。run(async(context)={ wait context。回应. WriteAsync('Hello World!(Run)');});} public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。RunHelloWorld();}运行,页面显示:
上面我们使用了IApplicationBuilder。运行()配置中间件,另一种方法是IApplicationBuilder。使用():
public static void UseHelloWorld(此IApplicationBuilder应用程序){ app。使用(async (context,next)={ wait context。回应. WriteAsync('Hello World!(使用) n’;等待下一个();});} public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。usehellowworld();app。RunHelloWorld();}运行,页面显示:
更好的做法是将中间件定义为一个单独的类:
公共类hellowordmiddleware { private readonly request delegate _ next;public hellowordmiddleware(request delegate next){ _ next=next;}公共异步任务调用(HttpContext上下文){ await上下文。回应. WriteAsync('Hello World!(在课堂上使用) n’;wait _next(上下文);} }公共静态类usehelloworldingclass extensions {公共静态IApplicationBuilder usehelloworldingclass(此IApplicationBuilder应用程序){ return app。usemiddleware hellowordmiddleware();} } public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。usehellowworld();app。usehelloworldingclass();app。RunHelloWorld();}运行,页面显示:
讨论
中间件是拦截HTTP请求和响应消息的组件。我们通过创建这些组件链为我们的应用程序创建一个请求管道。
我们通过Configure()方法的IApplicationBuilder参数创建这个请求管道。IApplicationBuilder参数有以下方法:
Run():添加中间件并终止请求管道(即不调用下一个中间件)。Use():添加中间件,使用lambda表达式或具体的类。Map():根据请求路径添加中间件。奔跑
此方法接受RequestDelegate委托作为参数,并在调用委托方法时接受HttpContext参数。此委托方法返回void,因为它终止了请求管道。
使用
这个方法接受Func委托作为参数,这个委托方法有两个参数,即HttpContext和next指向下一个中间件,返回null (Task)。如果不调用下一个中间件,请求管道将被终止(就像Run的效果一样)。
用户中间件
当通过单独的类创建中间件时,我们使用UseMiddleware方法,并将特定的实现类型作为通用参数。
在中间件类中,有两个重要的部分:
1.构造函数接受RequestDelegate。当这个委托被调用时,当前的请求被传递给下一个中间件。
2.它有一个Invoke方法,该方法接收HttpContext参数并返回null(任务)。当需要中间件时,框架会主动调用这个方法。
注意:在一个单独的类中实现中间件并用UseMiddleware封装它是一个最佳实践。
扩展方法
注意延伸方法的差异。RunXXX不会返回值,但是UseXXX会返回值(IApplicationBuilder)。这是因为Run()会终止请求管道,而Use()可能会链接到其他中间件。
顺序
中间件按照它在Configure()方法中出现的顺序被调用。返回给客户端的响应也将通过相同的中间件管道。
源代码下载
原文:https://tahirnaushad.com/2017/08/14/asp-net-core-middleware/
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。