OWIN — Open Web Interface for .NET
こないだ 1.0 になった ASP.NET SignalR をインストールしたときに、Owin とか Microsoft.AspNet.SignalR.Owin がインストールされてるので気が付いた人もいると思いますが、SignalR はこの OWIN 上でホストされていたりします。
そして、事実上の OWIN リファレンス実装が Katana Project です。
ちゃんと SignalR の GitHub リポジトリを見ると、submodule として Katana が取り込まれてます。
で、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
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 の仕様書を読んでください。
更には、node.js 向けに owin モジュールが提供されているようで、これを使えば node.js と C# コードの連携が出来るようになっているようです。詳しくは以下のブログを参照してください。
Tomek on Software: Hosting .NET code in node.js applications using OWIN
いまいち使い道はわからないのですが、連携が必要になった時には柔軟に使えそうですね。