我试图了解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/

10-10 18:27
查看更多