WCF Web HTTP プログラミング モデルの概要
Windows Communication Foundation (WCF) WEB HTTP プログラミング モデルは、WCF で WEB HTTP サービスを構築するために必要な基本的な要素を提供します。 WCF WEB HTTP サービスは、Web ブラウザーを含む、可能な限り幅広いクライアントからアクセスできるように設計されており、次の固有の要件があります。
URI と URI 処理 URI は、WEB HTTP サービスの設計において中心的な役割を果たします。 WCF WEB HTTP プログラミング モデルでは、UriTemplate クラスと UriTemplateTable クラスを使用して URI 処理機能を提供します。
WEB HTTP サービス GET 操作と POST 操作のサポートでは、データの変更とリモート呼び出しのさまざまな呼び出し動詞に加えて、データ取得に GET 動詞を使用します。 WCF WEB HTTP プログラミング モデルでは、WebGetAttribute と WebInvokeAttribute を使用して、サービス操作を GET と PUT、POST、DELETE などの他の HTTP 動詞の両方に関連付けます。
Web スタイルのサービス 複数のデータ形式は、SOAP メッセージに加えてさまざまな種類のデータを処理します。 WCF WEB HTTP プログラミング モデルでは、WebHttpBinding と WebHttpBehavior を使用して、XML ドキュメント、JSON データ オブジェクト、画像、ビデオ ファイル、プレーン テキストなどのバイナリ コンテンツのストリームなど、さまざまなデータ形式をサポートします。
WCF WEB HTTP プログラミング モデルは、WCF の範囲を拡張して、WEB HTTP サービス、AJAX および JSON サービス、配信 (ATOM/RSS) フィードを含む Web スタイルのシナリオに対応します。 AJAX および JSON サービスの詳細については、AJAX 統合と JSON サポート を参照してください。 シンジケーションの詳細については、「WCF シンジケーションの概要を参照してください。
WEB HTTP サービスから返すことができるデータの種類に関する追加の制限はありません。 任意のシリアル化可能な型は、WEB HTTP サービス操作から返すことができます。 WEB HTTP サービス操作は Web ブラウザーで呼び出すことができるため、URL で指定できるデータ型には制限があります。 既定でサポートされる型の詳細については、後述の「UriTemplate クエリ文字列パラメーターと URL」セクションを参照してください。 既定の動作は、URL で指定されたパラメーターを実際のパラメーター型に変換する方法を指定する独自の T:System.ServiceModel.Dispatcher.QueryStringConverter 実装を提供することで変更できます。 詳細については、QueryStringConverter を参照してください。
注意
WCF WEB HTTP プログラミング モデルで記述されたサービスでは、SOAP メッセージは使用されません。 SOAP は使用されないため、WCF によって提供されるセキュリティ機能は使用できません。 ただし、HTTPS でサービスをホストすることで、トランスポート ベースのセキュリティを使用できます。 WCF セキュリティの詳細については、「セキュリティの概要」を参照してください。
警告
IIS 用の WebDAV 拡張機能をインストールすると、WebDAV 拡張機能がすべての PUT 要求の処理を試みると、Web HTTP サービスから HTTP 405 エラーが返される可能性があります。 この問題を回避するには、WebDAV 拡張機能をアンインストールするか、Web サイトの WebDAV 拡張機能を無効にします。 詳細については、「IIS と WebDav」を参照してください。
UriTemplate と UriTemplateTable を使用した URI 処理
URI テンプレートは、構造的に似た URI の大規模なセットを表現するための効率的な構文を提供します。 たとえば、次のテンプレートは、中間セグメントの値に関係なく、"a" で始まり、"c" で終わるすべての 3 セグメント URI のセットを表します。a/{segment}/c
このテンプレートでは、次のような URI について説明します。
a/x/c
a/y/c
a/z/c
などなど。
このテンプレートでは、中かっこ ("{segment}") はリテラル値ではなく変数セグメントを示します。
.NET Framework には、UriTemplateと呼ばれる URI テンプレートを操作するための API が用意されています。 UriTemplates
次の操作を実行できます。
パラメーターのセットを使用して
Bind
メソッドのいずれかを呼び出して、テンプレートに一致する完全に閉じた URI を生成できます。 つまり、URI テンプレート内のすべての変数が実際の値に置き換えられます。候補 URI
Match
() を呼び出すことができます。テンプレートを使用して候補 URI をその構成要素に分割し、テンプレート内の変数に従ってラベル付けされた URI のさまざまな部分を含むディクショナリを返します。Bind
() とMatch
() は逆であるため、Match
(Bind
( x) ) を呼び出して、開始したのと同じ環境に戻ることができます。
(特にサーバーでは、URI に基づいてサービス操作に要求をディスパッチする必要がある) データ構造内の一連の UriTemplate オブジェクトを追跡し、含まれる各テンプレートに個別に対処することが必要な場合があります。 UriTemplateTable は、一連の URI テンプレートを表し、テンプレートのセットと候補 URI に対して最適な一致を選択します。 これは特定のネットワーク スタック (WCF を含む) に関連付けされていないため、必要に応じて使用できます。
WCF サービス モデルでは、UriTemplate と UriTemplateTable を使用して、サービス操作を、UriTemplateによって記述された URI のセットに関連付けます。 サービス操作は、WebGetAttribute または WebInvokeAttributeを使用して、UriTemplateに関連付けられます。 UriTemplate と UriTemplateTableの詳細については、「UriTemplate と UriTemplateTable」を参照してください。
WebGet および WebInvoke 属性
WCF WEB HTTP サービスでは、さまざまな呼び出し動詞 (HTTP POST、PUT、DELETE など) に加えて、取得動詞 (HTTP GET など) を使用します。 WCF WEB HTTP プログラミング モデルを使用すると、サービス開発者は、WebGetAttribute と WebInvokeAttributeを使用して、サービス操作に関連付けられている URI テンプレートと動詞の両方を制御できます。 WebGetAttribute と WebInvokeAttribute を使用すると、個々の操作を URI にバインドする方法と、それらの URI に関連付けられている HTTP メソッドを制御できます。 たとえば、次のコードに WebGetAttribute と WebInvokeAttribute を追加します。
[ServiceContract]
interface ICustomer
{
//"View It"
[WebGet]
Customer GetCustomer():
//"Do It"
[WebInvoke]
Customer UpdateCustomerName( string id,
string newName );
}
上記のコードでは、次の HTTP 要求を行うことができます。
GET /GetCustomer
POST /UpdateCustomerName
WebInvokeAttribute 既定では POST ですが、他の動詞にも使用できます。
[ServiceContract]
interface ICustomer
{
//"View It" -> HTTP GET
[WebGet( UriTemplate="customers/{id}" )]
Customer GetCustomer( string id ):
//"Do It" -> HTTP PUT
[WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
Customer UpdateCustomer( string id, Customer newCustomer );
}
WCF WEB HTTP プログラミング モデルを使用する WCF サービスの完全なサンプルについては、「方法: 基本的な WCF Web HTTP サービスを作成する」を参照してください。
UriTemplate クエリ文字列のパラメーターと URL
Web スタイルのサービスは、サービス操作に関連付けられている URL を入力することで、Web ブラウザーから呼び出すことができます。 これらのサービス操作は、URL 内の文字列形式で指定する必要があるクエリ文字列パラメーターを受け取る場合があります。 次の表は、URL 内で渡すことができる型と、使用される形式を示しています。
種類 | 形式 |
---|---|
Byte | 0 - 255 |
SByte | -128 - 127 |
Int16 | -32768 - 32767 |
Int32 | -2,147,483,648 - 2,147,483,647 |
Int64 | -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807 |
UInt16 | 0 - 65535 |
UInt32 | 0 - 4,294,967,295 |
UInt64 | 0 - 18,446,744,073,709,551,615 |
Single | -3.402823e38 - 3.402823e38 (指数表記は必要ありません) |
Double | -1.79769313486232e308 - 1.79769313486232e308 (指数表記は必要ありません) |
Char | 任意の 1 文字 |
Decimal | 標準表記の任意の 10 進数 (指数なし) |
Boolean | True または False (大文字と小文字は区別されません) |
String | 任意の文字列 (null 文字列はサポートされておらず、エスケープは行われません) |
DateTime | MM/DD/YYYY MM/DD/YYYY HH:MM:SS [AM|PM] 月 日 年 月 日 年 HH:MM:SS [AM|PM] |
TimeSpan | DD.HH:MM:SS ここで、DD = 日、HH = 時間、MM = 分、SS = 秒 |
Guid | GUID。たとえば、次のようになります。 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
DateTimeOffset | YYYY/MM/DD HH:MM:SS MM:SS ここで、DD = 日、HH = 時間、MM = 分、SS = 秒 |
列挙型 | 例えば、次のコードに示すように、列挙を定義するための列挙値。public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; 個々の列挙値 (またはその対応する整数値) は、クエリ文字列で指定できます。 |
型と文字列表現を双方向に変換できる TypeConverterAttribute を持つ型。 |
型コンバーターによって異なります。 |
形式と WCF WEB HTTP プログラミング モデル
WCF WEB HTTP プログラミング モデルには、さまざまなデータ形式を操作するための新機能があります。 バインド レイヤーでは、WebHttpBinding は次のさまざまな種類のデータの読み取りと書き込みを行うことができます。
- XML
- JSON
- 不透明なバイナリ ストリーム
つまり、WCF WEB HTTP プログラミング モデルではあらゆる種類のデータを処理できますが、Streamに対してプログラミングを行うことができます。
.NET Framework 3.5 では、JSON データ (AJAX) と配信フィード (ATOM や RSS を含む) がサポートされています。 これらの機能の詳細については、「WCF Web HTTP Formatting、WCF Syndication Overview、および AJAX Integration and JSON Support」を参照してください。
WCF WEB HTTP プログラミング モデルとセキュリティ
WCF WEB HTTP プログラミング モデルでは WS-* プロトコルがサポートされていないため、WCF WEB HTTP サービスをセキュリティで保護する唯一の方法は、SSL を使用して HTTPS 経由でサービスを公開することです。 IIS 7.0 での SSL の設定の詳細については、「IISで SSL を実装する方法」を参照してください。
WCF WEB HTTP プログラミング モデルのトラブルシューティング
ChannelFactoryBase<TChannel> を使用して WCF WEB HTTP サービスを呼び出してチャネルを作成する場合、WebHttpBehavior は、別の EndpointAddress が ChannelFactoryBase<TChannel>に渡された場合でも、構成ファイルに設定された EndpointAddress を使用します。