我试图了解OWIN和Katana ..当然,可以自托管该应用程序,也可以将其托管在Nancy或非IIS上,这很酷。出现此问题的原因是我们想使用MVC5(VS 2013)创建一个Web应用程序,该应用程序将托管在Windows Azure的IIS上。
但是,我们收到了在mvc5应用程序中使用OWIN中间件组件/软件包的建议,以获得可插拔架构,性能等优点。
我想了解一下,如果我们在MVC5应用程序中使用OWIN中间件,它将获得性能提升,该中间件将托管在Windows Azure的IIS上。通过使用owin中间件软件包,我的应用程序是否会跳过IIS管道中的许多不必要的事情?当将OWIN托管在IIS上时,在MVC5中使用OWIN还有其他好处吗?
最佳答案
是的,您将有可能跳过管道中的许多不必要的事情,因为您将定义管道中的组件,并使用您的应用程序不一定要使用的其他组件。这些组件是中间件,因为它们位于处理管道的中间,并且这些组件可以决定通过async/await
C#语法将控制权传递给管道中的下一个组件,或者在该组件处结束处理。AppFunc
对象是在Katana中发生“魔术”的地方,因为它是组件被调用时使用的逻辑,签名是这样的:
Func<IDictionary<string, object>, Task>;
组件的一个示例是匹配
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...
}
那么,您如何知道下一个组件是什么呢?
组件的构造函数需要接受
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);
}
}
关于asp.net - 在MVC5应用程序中使用OWIN软件包的好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19944704/