在MVC5应用程序中使用OWIN包的好处

Sud*_*hir 13 asp.net iis azure owin katana

我试图了解OWIN和Katana ..当然,应用程序可以自托管,也可以托管在Nancy或非IIS上,这很酷.这个问题的原因是我们想要使用MVC5(VS 2013)创建一个Web应用程序,它将托管在Windows Azure的IIS上.

但是,我们收到了在mvc5应用程序中使用OWIN中间件组件/软件包的建议,以获得可插拔架构,性能等的好处.

我想了解如果我们在MVC5应用程序中使用OWIN中间件将会获得性能提升,该应用程序将托管在Windows Azure中的IIS上.我的应用程序是否会通过使用owin中间件包在IIS管道中跳过很多不必要的东西?当它在IIS上托管时,我可以通过在MVC5中使用OWIN获得任何其他好处吗?

Kar*_*son 4

是的,您可能能够跳过管道中的许多不必要的事情,因为您将定义管道中的组件,以及使用应用程序将使用的不一定由您创建的其他组件。这些组件是中间件,因为它们位于处理管道的中间,并且组件可以决定通过 C async/await# 语法将控制权传递给管道中的下一个组件,或者结束该组件的处理。

对象AppFunc是 Katana 中“魔法”发生的地方,因为它是组件被调用时使用的逻辑,签名是这样的:

Func<IDictionary<string, object>, Task>;
Run Code Online (Sandbox Code Playgroud)

注意:IDictionary<string, object>代表环境值(例如RequestResponse;在 ASP.NET 中思考HttpContext),OWIN 标准定义了该字典中必须存在的某些值,例如"owin.RequestBody""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...
}
Run Code Online (Sandbox Code Playgroud)

注意: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);
    }
}
Run Code Online (Sandbox Code Playgroud)