我正在尝试了解OWIN和Katana ..当然,应用程序可以自托管或可以在Nancy或非IIS上托管,这很酷。这个问题的原因是我们想要使用MVC5(VS 2013)创建一个Web应用程序,它将托管在Windows Azure中的IIS上。
但是,我们建议在mvc5应用程序中使用OWIN中间件组件/软件包,以获得可插拔架构,性能等的好处。
我想了解如果我们在MVC5应用程序中使用OWIN中间件将会获得性能提升,该应用程序将在Windows Azure中的IIS上托管。我的应用程序是否会通过使用owin中间件包在IIS管道中跳过很多不必要的东西?当它在IIS上托管时,我可以通过在MVC5中使用OWIN获得任何其他好处吗?
答案 0 :(得分:4)
是的,您可能会跳过管道中的许多不必要的东西,因为您将定义管道中的组件,以及使用您的应用程序将使用的其他组件,而不是您自己制作的组件。这些组件是中间件,因为它们位于处理管道的中间,组件可以决定通过async/await
C#语法将控制权传递给管道中的下一个组件,或者结束该组件的处理。
AppFunc
对象是Katana中“魔法”发生的地方,因为它是组件在调用时使用的逻辑,签名是这样的:
Func<IDictionary<string, object>, Task>;
注意:
IDictionary<string, object>
代表环境值(例如Request
和Response
;认为ASP.NET中的HttpContext
)并且OWIN标准定义了必须的某些值存在于此词典中,例如"owin.RequestBody"
或"owin.ResponseBody"
。 Katana是微软对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希望该方法返回
Task
或生成异常,因此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);
}
}