C# 中间件应该总是调用下一个?
我一直在试图了解ASP.NET5管道中间件是如何工作的。据我所知,中间件只是一个C# 中间件应该总是调用下一个?,c#,owin,asp.net-core,C#,Owin,Asp.net Core,我一直在试图了解ASP.NET5管道中间件是如何工作的。据我所知,中间件只是一个Func,它是指向一个方法的指针,该方法接收对下一个请求委托的引用,并返回一个新的方法来包装下一个请求委托。当然,我们可以使用类来表示中间件,例如: public class MyMiddleware { private readonly _next; public MyMiddleware(RequestDelegate next) { if (next == null)
Func
,它是指向一个方法的指针,该方法接收对下一个请求委托的引用,并返回一个新的方法来包装下一个请求委托。当然,我们可以使用类来表示中间件,例如:
public class MyMiddleware
{
private readonly _next;
public MyMiddleware(RequestDelegate next)
{
if (next == null)
{
throw new ArgumentNullException("next");
}
_next = next;
}
public Task Invoke(HttpContext context)
{
// New request delegate code here which can wrap the next one on the pipeline
}
}
由于RequestDelegate
是一个委托,它可以保存对方法的引用,这些方法接收一个HttpContext
并返回一个Task
,Invoke
方法是要返回的请求委托,并且可以访问管道上的下一个委托
在编写中间件时,我们可以访问管道的下一个组件,但我对此表示怀疑。起初,我认为理想的工作方式是:
- 检查中间件是否可以处理请求
- 如果可以,可以使用
HttpContext
- 调用管道上的下一个中间件
- 检查中间件是否可以处理请求
- 如果可以的话,可以使用
执行所有必须执行的操作,仅此而已HttpContext
- 如果没有,请呼叫下一个
我认为中间件只有在不能处理请求时才应该调用next。我认为这是因为如果不是这样,管道上的中间件之间会存在耦合。因此,为了处理请求,中间件需要知道前一个中间件做了什么,以避免弄乱一切。这个结论正确吗?中间件的存在使请求管道模块化,这意味着只要遵守合同,您就可以从中添加/删除/更换部件。例如,如果您的应用程序在没有任何缓存的情况下为某些文件提供服务,那么您可以在管道前端添加一个中间件,而无需更改其余部分。它们是积木 中间件可以: