owin - .netにおけるpsgi -
TRANSCRIPT
OWIN- .NETにおけるPSGI -
2014/12/13 - #nds39
TAKANO Sho(高野将)/ @masaru_b_cl
自己紹介
プログラマー兼業家政夫
お父さん業も取り扱っております
CodeZine等で執筆業も
懐かしのLTSV祭りのときのC#実装”DynamicLTSV”の中の人
http://rebuild.fm/1
https://gist.github.com/akiyan/5010610#ltsv--0004526
#nds39 2
OWINとは?
OWIN — Open Web Interface for .NET
http://owin.org/
“OWIN defines a standard interface between
.NET web servers and web applications.”
”OWINは.NET WebサーバーとWebアプリケーション間の標準インターフェースを定める。”
#nds39 5
どういうことか?
旧来の.NET Webアプリケーション構成
IIS
.NET Webアプリ
IIS(Internet Information Service)*と不可分
* Windows Serverに搭載されたWebサーバーコンポーネント
#nds39 6
HTTP(S)
OWINでどうなるか?
したがって……
Windowsサービス*
orコンソールアプリ
.NETWebアプリ
IIS以外でセルフホストすることもできる
* POSIX環境でいうdaemon
#nds39 9
OWINHTTP(S)
OWINでどうなるか?
さらに……
コンソールアプリ
.NETWebアプリ
Mac、Linux上のMono*でもホストできる
* .NET FrameworkランタイムのOSS実装
#nds39 10
OWINHTTP(S)
Mono
on
Mac, Linux
OWINの概要
OWINは先述の通りインターフェース定義
つまり、あくまで仕様
OWIN 1.0 Specification
http://owin.org/spec/spec/owin-1.0.0.html
#nds39 12
OWINの概要
PerlでいうPSGI、PythonでいうWSGIにあたる
PSGI - search.cpan.org
http://search.cpan.org/~miyagawa/PSGI-1.102/PSGI.pod
WSGI — WSGI.org
http://wsgi.readthedocs.org
#nds39 13
OWINの仕様
OWINでは以下のapplication delegate(AppFunc)にて
パイプライン処理を行う
#nds39 14
using AppFunc = Func<IDictionary<string, object>, // EnvironmentTask>; // Done
OWINの仕様
Enviromment
型 : IDictionary<string, object>
OWINのパイプラインに必要なすべての情報を格納する
ハッシュテーブル
文字列をキーとして、最も汎用的な型であるobject型で
各情報を持つ
キーの値はOWINの仕様で定められた他、
独自のキーを使用することもできる
#nds39 15
OWINの仕様
Done
型 : Task
OWINのパイプラインの次の処理を呼び出す非同期動作
呼び出すことでパイプライン処理を次に進める
呼び出さなければパイプライン処理を打ち切る
#nds39 16
OWINの処理イメージ
AppFuncの一つ一つがOWINミドルウェアと呼ばれる
OWINミドルウェアではEnvironmentの情報の出し入れを行う
Doneタスクでコアに向かってパイプラインを進める
#nds39 17
“owin.RequestMethod” “GET”
“owin.RequestHeaders ハッシュテーブル
: :
Environment
AppFunc
1
AppFunc
2
AppFunc
Core…
Request
Response
Done Done
OWINの処理イメージ
OWINミドルウェアのそれぞれは小さな一つの処理を担当する
エラーハンドリング、キャッシュ、ルーティング、セッション、etc…
このミドルウェアを柔軟に組み合わせることで、拡張性に優れた
Webアプリケーションを構築する
WSGIのタマネギのイメージ
#nds39 18
※イメージはここから参照
Concepts of Pylons — Pylons Framework 1.0.1 documentation
http://docs.pylonsproject.org/projects/pylons-
webframework/en/latest/concepts.html#wsgi-middleware
Katanaプロジェクト
Microsoftによるリファレンス実装
Owin.dllをラップするMicrosoft.Owin名前空間
素のOwin.dllではやはりつらい
生のキーを使ったダウンキャストの嵐
Microsoft.Owinを使うことで簡単に実装できる
型安全
ミドルウェア基底型
#nds39 22
コード例(Hello World)
Plack
#nds39 23
my $app = sub {return [
200,[ 'Content-Type' => 'text/plain' ],[ 'Hello World' ]
];};
※Plack Handbook | Day 2: Hello World よりhttps://github.com/miyagawa/plack-handbook/blob/master/ja%2F02_hello_world.md
コード例(Hello World)
Microsoft.Owin
#nds39 24
public class Startup{public void Configuration(IAppBuilder app){app.Run(async context =>
{var response = context.Response;response.StatusCode = 200;response.ContentType = "text/plain";await response.WriteAsync("Hello World");
});}
}
※Getting Started with OWIN and Katana | The ASP.NET Site よりhttp://www.asp.net/aspnet/overview/owin-and-katana/getting-started-with-owin-and-katana
コード例(Hello World)
DEMO
#nds39 25
• Hello World
コード例(ミドルウェア)
Plack
#nds39 26
use Plack::Builder;my $app = sub { ... };
builder {enable "SomeMiddleware";$app;
};
※Plack Handbook | Day 10: Plackミドルウェアの利用よりhttps://github.com/miyagawa/plack-handbook/blob/master/ja%2F10_using_plack_middleware.md
コード例(ミドルウェア)
Microsoft.Owin
#nds39 27
public class Startup{public void Configuration(IAppBuilder app){app.Use(async (context, next) =>{
...await next();
});
app.Run(async context => ...);}
}
※neue cc - OWINのパイプラインとMiddleware作成ガイドよりhttp://neue.cc/2014/01/06_442.html
コード例(ミドルウェア)
Microsoft.Owin
#nds39 28
public class Startup{public void Configuration(IAppBuilder app){...
app.Use<SomeMiddleware>(someOption);
app.Run(async context => ...);}
}
※neue cc - OWINのパイプラインとMiddleware作成ガイドよりhttp://neue.cc/2014/01/06_442.html
コード例(ミドルウェア)
DEMO
#nds39 29
• インラインでのミドルウェア記述• 独立したミドルウェアの使用• Basic認証ミドルウェアの使用
OWINのホスティング
IISホスト
開発 IIS Express
テスト IIS
運用 IIS / Azure Web Site
セルフホスト
Console App
Heroku with Mono
Windows Service
#nds39 31
IISホスト Azure Web Site
DEMO
#nds39 32
• http://nds39-owin.azurewebsites.net/
セルフホスト Heroku with Mono
DEMO
#nds39 33
• https://nds39-owin.herokuapp.com/
次のASP.NET
2系統に分かれる
ASP.NET 5 新たな実装によるASP.NET
ASP.NET 4.6 現行ASP.NETの進化版
ASP.NET 5は.NET Coreでも動作する
#nds39 35
.NET Core
.NET Frameworkのサーバーサイド部分のサブセット
デスクトップ開発用のライブラリを含まない
オープンソース化が決定
.NET Core がオープンソースに
http://blogs.msdn.com/b/visualstudio_jpn/archive/2014/11/13/net-core-is-open-source.aspx
Mac、Linux向けのランタイムも提供される
#nds39 36
.NET 2015
#nds39 37
http://blogs.msdn.com/b/dotnet/archive/2014/11/12/net-core-is-open-source.aspx
ASP.NET 5でどうなるか?
ASP.NET 5のアプリケーション構成
IIS(Winのみ)
or
kestrel,セルフホスト
(Win,Mac,Linux)
.NETWebアプリ
すべての主要プラットフォーム上で動作し、
ランタイムの差し替えもできる
#nds39 38
ASP.NET 5
HTTP(S)
.NET 4.6(Winのみ)
or
.NET Core 5,
Mono
(Win,Mac,Linux)
ASP.NET 5でどうなるか?
ASP.NET 5のアプリケーション構成
IIS(Winのみ)
or
kestrel,セルフホスト
(Win,Mac,Linux)
.NETWebアプリ
すべての主要プラットフォーム上で動作し、
ランタイムの差し替えもできる
#nds39 39
ASP.NET 5
HTTP(S)
.NET 4.6(Winのみ)
or
.NET Core 5,
Mono
(Win,Mac,Linux)
OWINじゃない!?
The OWIN is dead!?
ASP.NET 5ではOWINをASP.NETのコア部分に再実装
Microsoft.AspNet.Http名前空間
Owin.dllへの依存はなく互換性はない
Owin IAppBuilder
ASP.NET 5 IApplicationBuilder
#nds39 40
Long live the OWIN!
OWINの概念は継承されているので、
同じようにミドルウェアを作成できる
既存のOWINミドルウェアは互換レイヤーを使えば利用可能
ASP.NET 4.6では現行のOWIN実装しか使えない
#nds39 41
ASP.NET 5 Preview
DEMO
#nds39 42
• Basic認証ミドルウェアの使用
Conclusion
OWINはWebサーバーとWebアプリ間の
インターフェース定義
PerlでいうPSGIにあたる
ミドルウェアを組み合わせて柔軟でプラガブルな構成
OWINはIISに囚われない
セルフホストが可能
Monoでも動作する
#nds39 44
Conclusion
リファレンス実装はKatanaプロジェクト
Microsoft.Owin
ASP.NET 5ではKatanaプロジェクトではなく一から再実装
Microsoft.AspNet.Http
Windows、Mac、Linux向けの.NET Coreでも動く
The OWIN is dead. Long live the OWIN.
#nds39 45