しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

OWIN - Open Web Interface for .NET とは何か?

OWIN — Open Web Interface for .NET

f:id:shiba-yan:20130225224911p:plain

こないだ 1.0 になった ASP.NET SignalR をインストールしたときに、Owin とか Microsoft.AspNet.SignalR.Owin がインストールされてるので気が付いた人もいると思いますが、SignalR はこの OWIN 上でホストされていたりします。

そして、事実上の OWIN リファレンス実装が Katana Project です。

Katana Project - Home

ちゃんと SignalR の GitHub リポジトリを見ると、submodule として Katana が取り込まれてます。

f:id:shiba-yan:20130303215942p:plain

で、OWIN って結局のところ何?使うと良いことでもあるん?という感じなので、まずは仕様書を確認しましょう。

OWIN — Open Web Server Interface for .NET

つまりはサーバを抽象化したインターフェースを提供するのが OWIN ということです。そしてサーバを抽象化することで、今までは個別に対応が必要だった Self host に容易に対応可能という点がメリットとして挙げられます。

事実、SignalR は 0.5.3 の頃には ASP.NET 上でホストするライブラリと、コンソールアプリケーションなどでホストするライブラリが用意されていましたが、1.0 からは Owin を使うことで Self host に対応する形をとっています。

Self host · SignalR/SignalR Wiki · GitHub

WebApplication.Start メソッドを呼び出すだけで、SignalR アプリケーションをコンソールアプリケーション上でホスティング出来ます。

OWIN を使うこと自体は OWIN 向けのハンドラを作成して、渡されてくる IDictionary から取得できるストリームに書き込んだりするだけで良いみたいです。今のところ Katana のドキュメントが皆無なので非常にしんどいと思いますが、Hello World 的なコードを作成したので載せておきます。

class Program
{
    static void Main(string[] args)
    {
        using (WebApplication.Start<Startup>("http://localhost:8080/"))
        {
            Console.ReadKey();
        }
    }
}

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use(typeof(Handler));
    }
}

public class Handler
{
    public Handler(Func<IDictionary<string, object>, Task> next)
    {
    }

    public Task Invoke(IDictionary<string, object> environment)
    {
        environment["owin.ResponseStatusCode"] = 200;

        using (var writer = new StreamWriter((Stream)environment["owin.ResponseBody"]))
        {
            return writer.WriteAsync("Hello, OWIN");
        }
    }
}

これを実行すると以下のように "Hello, OWIN" と表示されます。environment で渡されるキーは OWIN の仕様書を読んでください。

f:id:shiba-yan:20130303225035p:plain

更には、node.js 向けに owin モジュールが提供されているようで、これを使えば node.js と C# コードの連携が出来るようになっているようです。詳しくは以下のブログを参照してください。

Tomek on Software: Hosting .NET code in node.js applications using OWIN

いまいち使い道はわからないのですが、連携が必要になった時には柔軟に使えそうですね。