13

私は OWIN と Katana を理解しようとしています.確かに、アプリケーションを自己ホストすることも、Nancy または IIS 以外でホストすることもできます。この質問の理由は、Windows Azure の IIS でホストされる MVC5 (VS 2013) を使用して Web アプリケーションを作成したいからです。

ただし、mvc5 アプリケーションで OWIN ミドルウェア コンポーネント/パッケージを使用して、プラグ可能なアーキテクチャ、パフォーマンスなどの利点を得ることが推奨されました。

Windows Azure の IIS でホストされる MVC5 アプリケーションで OWIN ミドルウェアを使用すると、パフォーマンスがどのように向上するかを理解したいと思います。アプリケーションは、owin ミドルウェア パッケージを使用することで、IIS パイプ内の多くの不要なものをスキップしますか? IIS でホストされている場合、MVC5 で OWIN を使用することで得られるその他の利点はありますか?

4

1 に答える 1

4

はい、パイプラインでコンポーネントを定義し、アプリケーションが使用する他のコンポーネントを使用する必要があるため、パイプラインで多くの不要なものをスキップできる可能性があります。async/awaitこれらのコンポーネントは処理パイプラインの途中にあり、コンポーネントはC# 構文を介してパイプライン内の次のコンポーネントに制御を渡すか、そのコンポーネントで処理を終了するかを決定できるため、ミドルウェアです。

AppFuncオブジェクトは、カタナで「魔法」が発生する場所です。これは、コンポーネントが呼び出されたときにコンポーネントが使用するロジックであるためです。署名は次のとおりです。

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

注:IDictionary<string, object>は環境値を表し ( ASP.NET ではRequestandなど)、 ResponseOWINHttpContext標準では、このディクショナリに存在する必要がある特定の値 ( "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 は、メソッドが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);
    }
}
于 2013-11-13T04:00:32.733 に答える