owin - .netにおけるpsgi -

46
OWIN - .NETにおけるPSGI - 2014/12/13 - #nds39 TAKANO Sho (高野 将) / @ masaru_b_cl

Upload: sho-takano

Post on 16-Jul-2015

837 views

Category:

Technology


1 download

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

Agenda

OWINとは?

OWINの概要

OWINの実装

OWINのホスティング

そしてASP.NET 5へ

#nds39 3

OWINとは?

#nds39 4

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)

どういうことか?

IISと密に結合していることで……

リクエストパイプライン処理などが重い

ポータブルでない

Windows以外で動かない

#nds39 7

OWINでどうなるか?

OWINのWebアプリケーション構成

IIS等のWebサーバー

.NETWebアプリ

IISから解放される

#nds39 8

OWINHTTP(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の概要

#nds39 11

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

OWINの実装

#nds39 19

OWINの実装

OWINは仕様でありその実装が必要

PSGIにおけるPlack等

WSGIにおけるPylons等

Owinのインターフェース定義はOwin.dll

#nds39 20

OWINの実装

アプリケーションフレームワークの

デファクトスタンダードはKatanaプロジェクト

その他の実装

Nowin

サーバー、ホスト環境

Freya

F#実装

#nds39 21

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

コード例(ミドルウェア)

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

OWINのホスティング

#nds39 30

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 5へ

#nds39 34

次の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

Conclusion

#nds39 43

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

Ask me any questions!

#nds39 46