13

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

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

我想了解如果我们在 MVC5 应用程序中使用 OWIN 中间件将如何提高性能,该应用程序将托管在 Windows Azure 中的 IIS 上。我的应用程序会通过使用 owin 中间件包跳过 IIS 管道中的许多不必要的事情吗?在 IIS 上托管时,在 MVC5 中使用 OWIN 是否还有其他好处?

4

1 回答 1

4

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

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

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

注意:IDictionary<string, object>表示环境值(例如Requestand ResponseHttpContext在 ASP.NET 中思考),OWIN 标准定义了必须存在于该字典中的某些值,例如"owin.RequestBody"or "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...
}

注意:OWIN 期望该方法返回 aTask或生成异常,因此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);
    }
}
于 2013-11-13T04:00:32.733 回答