是的,您可能会跳过管道中许多不必要的事情,因为您将定义管道中的组件,以及使用您的应用程序将使用的其他不一定由您制作的组件。这些组件是中间件,因为它们位于处理管道的中间,并且组件可以决定通过async/await
C# 语法将控制权传递给管道中的下一个组件,或者在该组件处结束处理。
对象是 Katana 中“魔法”发生的AppFunc
地方,因为它是组件在调用时使用的逻辑,签名是这样的:
Func<IDictionary<string, object>, Task>;
注意:IDictionary<string, object>
表示环境值(例如Request
and Response
;HttpContext
在 ASP.NET 中思考),OWIN 标准定义了必须存在于该字典中的某些值,例如"owin.RequestBody"
or "owin.ResponseBody"
。Katana 是 Microsoft 对 OWIN 标准的实现,因此这些和其他字典项可以开箱即用。
组件的一个示例是与AppFunc
( 即 )的签名匹配的方法Func<IDictionary<string, object>, Task>
,如下所示:
public async Task Invoke(IDictionary<string, object> environment)
{
// Do processing...
// Wait for next component to complete
await _nextComponent(environment);
// Do more processing...
}
注意:OWIN 期望该方法返回 aTask
或生成异常,因此return null;
无效。
那么你怎么知道下一个组件是什么?
组件的构造函数需要接受 的参数Func<IDictionary<string, object>, Task>
,如下所示:
public class HelloWorldCOmponent
{
Func<IDictionary<string, object>, Task> _next;
public HelloWorldComponent(Func<IDictionary<string, object>, Task> next)
{
_next = next;
}
public async Task Invoke(IDictionary<string, object> environment)
{
// Do something
// Wait for next component to return
await _next(environment);
}
}