Share via


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 処理機能が提供されます。

  • GET と POST 操作のサポート: WEB HTTP サービスでは、データ変更やリモート呼び出しに必要なさまざまな起動用の動詞に加えて、データ取得に GET 動詞が使用されます。 WCF WEB HTTP プログラミング モデルでは、WebGetAttributeWebInvokeAttribute を使用して、サービス操作を 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/{segment}/c は、中間のセグメントの値を問わず、"a" で始まり "c" で終了する 3 つのセグメントから成る URI のセットを表しています。

このテンプレートによって、次のような URI が記述されます。

  • a/x/c

  • a/y/c

  • a/z/c

  • その他にもあります。

このテンプレートでは、中かっこによる表記 ("{segment}") で、リテラル値ではなく、変数のセグメントを示しています。

.NET Framework は UriTemplate という URI テンプレートでの作業に使用できる新しい API を提供します。 UriTemplates を使用すると、次のことができます。

  • 一連のパラメーターで Bind メソッドの 1 つを呼び出し、テンプレートに適合する "完全にクローズである URI" を生成できます。 つまり、URI テンプレート内の変数がすべて、実際の値に置き換えられます。

  • 候補の URI を使用して Match() を呼び出すことができます。このメソッドは、テンプレートを使用して候補の URI を構成要素に分解し、テンプレート内の変数に従って分類される URI のさまざまな要素を収めたディクショナリを返します。

  • Bind() と Match() は逆のもので、Match( Bind( x ) ) を呼び出し、最初と同じ環境に戻ることができます。

包含されたテンプレートを個別に扱うことができるデータ構造内の一連の UriTemplate オブジェクトを追跡することが必要になる場合がよくあります (特に、URI に基づいて要求をサービス操作にディスパッチすることが必要なサーバー上)。 UriTemplateTable は、URI テンプレートのセットを表し、テンプレート セットと候補の URI が与えられると、最適の組み合わせを選択します。 これは、特定のネットワーク スタックと結び付いていないので (WCF を含む)、必要な場合はいつでも使用できます。

WCF サービス モデルは、UriTemplate および UriTemplateTable を使用して、UriTemplate によって記述された URI セットにサービス操作を関連付けます。 サービス操作は、UriTemplate または WebGetAttribute によって WebInvokeAttribute に関連付けられます。 UriTemplate および UriTemplateTable の詳細については、「UriTemplate と UriTemplateTable」を参照してください。

WebGet および WebInvoke 属性

WCF WEB HTTP サービスでは、さまざまな呼び出し用の動詞 (HTTP POST、PUT、DELETE など) に加えて、取得のための動詞 (HTTP GET など) が使用されます。 WCF WEB HTTP プログラミング モデルでは、サービスの開発者は WebGetAttributeWebInvokeAttribute を使用して、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

サービス操作に関連付けられた URL を入力することによって、Web ブラウザーから 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 標準表記による任意の小数 (指数なし)
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 MM/DD/YYYY HH:MM:SS MM:SS

DD = 日、HH = 時、MM = 分、SS = 秒
列挙 列挙値。たとえば、次のコードのように列挙体を定義します。

public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

クエリ文字列に、任意の列挙値 (またはそれぞれに対応する integer 値) を指定できます。
型と文字列表現を双方向に変換できる TypeConverterAttribute を持つ型。 型コンバーターによって異なります。

形式と WCF WEB HTTP プログラミング モデル

WCF WEB HTTP プログラミング モデルには、さまざまなデータ形式を扱うための新機能が備わっています。 WebHttpBinding は、バインディング層で次のさまざまな種類のデータを読み書きできます。

  • XML

  • JSON

  • 不透明なバイナリ ストリーム

つまり、WCF WEB HTTP プログラミング モデルではあらゆる種類のデータを処理できますが、Stream に対してプログラミングすることもできます。

.NET Framework 3.5 は、配信フィード (ATOM および RSS) だけでなく、JSON データ (AJAX) にも対応しています。 これらの機能の詳細については、「WCF Web HTTP 書式設定」、「WCF 配信の概要」、および「AJAX の統合と JSON のサポート」を参照してください。

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 サービスを呼び出すと、異なる WebHttpBehaviorEndpointAddress に渡されるとしても、EndpointAddress は構成ファイルに設定されている ChannelFactoryBase<TChannel> を使用します。

関連項目