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

时间:2013-11-13 03:27:58

标签: 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获得任何其他好处吗?

1 个答案:

答案 0 :(得分:4)

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

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

Func<IDictionary<string, object>, Task>;

  

注意:IDictionary<string, object>代表环境值(例如RequestResponse;认为ASP.NET中的HttpContext)并且OWIN标准定义了必须的某些值存在于此词典中,例如"owin.RequestBody""owin.ResponseBody"。 Katana是微软对OWIN标准的实现,因此可以开箱即用这些和其他字典项目。


组件的一个示例是匹配AppFuncFunc<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);
    }
}