次の方法で共有


Silverlight と WCF の機能比較

Silverlight Version 3 Web サービスのスタックおよびプログラミング モデルは、その大部分を Windows Communication Foundation (WCF) のクライアント側を基盤としています。Web サービスをホストするための WCF サーバー機能は、Silverlight 3 では使用できません。WCF クライアント側機能は、このトピックで明記されている場合を除き、通常サポートされます。

WCF クライアント スタック

WCF クライアント スタックを使用してサービスにアクセスする方法は複数あります。

方法 : Silverlight からサービスにアクセスする」で説明されているように、自動的に生成されるプロキシ経由でサービスを呼び出すときに使用されます。この手順で、プロキシは、Silverlight プロジェクト用 Visual Studio 2008 の "サービス参照の追加" ツールを使用して生成される必要があります。WCF Svcutil.exe ツールを使用して生成されるプロキシは、Silverlight 3 では動作しません。

既に Windows Communication Foundation (WCF) サービス コントラクト定義がある場合は、プロキシを生成することなく、ジェネリック ChannelFactory クラスを使用できます。クライアントがサーバー上のプロジェクトとサービス定義コードを共有している場合などがこれに当てはまります。この場合は、サービス コントラクト インターフェイス IStockQuoteService を定義し、サーバーおよび Silverlight プロジェクトの両方で同じ IStockQuoteService コードを使用することができます。これには、ChannelFactory<IStockQuoteService> を使用します。この高度な手法は、「方法 : チャネル ファクトリを使用して、非同期的に操作を呼び出す」および「双方向サービスの構築およびアクセス」の Silverlight 3 のコンテキストに記載されています。サービス コントラクトの定義と使用に関する詳細については 、「サービス コントラクトの設計」を参照してください。

Dd470110.note(ja-jp,VS.95).gif
この手法を使用する場合、アプリケーションは、モバイル デバイスについて Silverlight 3 との互換性がなくなります。

WCF チャネル モードを直接使用して、コントラクトの制限のない任意のメッセージを送信することもできます。これは、最も複雑で最も強力な方法です。このことは、「クライアントのチャネル レベルのプログラミング」で説明されています。

どの方法が使用されるかに関係なく、非同期操作のみがサポートされます。同期操作は Silverlight 3 ではサポートされていません。詳細については 、「方法 : WCF サービス操作を非同期に呼び出す」および「方法 : チャネル ファクトリを使用して、非同期的に操作を呼び出す」を参照してください。

Dd470110.note(ja-jp,VS.95).gif
Silverlight から一方向サービスにアクセスするときは、非同期コールバック メソッドで戻り値 (生成されたプロキシの AsyncCompletedEventArgs パラメーターなど) へのアクセスを試行しないでください。アクセスしようとすると、例外が発生します。

アドレスおよびバインディング

前のセクションで説明されている方法のいずれかを使用してサービスにアクセスするときは、リモート サービス エンドポイントのアドレスとバインディングを指定する必要があります。アドレスは、サービスが "どこ" にあるかという質問に答え、バインディングはサービスと "どのように" 通信するかという質問に答えます。"どこにあるか" という質問に対する回答は URL になります。"どのように" という質問に対する回答は、サービスとの通信時に使用するプロトコルのリストになります。

通常、アドレスおよびバインディングは、コードを介して明示的に指定するか、または ServiceReferences.ClientConfig 構成ファイルで指定できます。構成ファイルの使用に関する詳細については 、「Silverlight クライアントでの Web サービスの使用方法の構成」を参照してください。

WCF はさまざまなバインディングをサポートしますが、Silverlight 3 では、以下のバインディングのみがサポートされます。

  • BasicHttpBinding : SOAP 1.1 を使用してサーバーと通信します。これは、ほとんどのサービス シナリオで使用する適切なバインディングです。Silverlight 3 の "サービス参照の追加" ツール、および ServiceReferences.ClientConfig ファイルでサポートされる唯一のバインディングです。このバインディングを使用する際に、WCF 以外の SOAP サービスと相互運用する場合は特に、「SOAP サービスへのアクセス」に記載されているプロトコルの制限の一覧を確認してください。たとえば、SOAP エラーはサポートされません。

  • PollingDuplexHttpBinding : サービスへの双方向接続を確立するために使用されます。このサービスはクライアントに任意にメッセージを送信できます。詳細については 、「双方向サービスの構築およびアクセス」を参照してください。

  • CustomBinding : Silverlight で提供されているバインディング要素を使用してカスタム バインディングを構築できます。または、開発者やサードパーティ ベンダーが自身でカスタム バインディングを構築できます。詳細については 、「カスタム バインディング」を参照してください。Silverlight 3 で提供されているのは以下のバインディング要素のみであることに注意してください。

キュー、信頼できるセッション、トランザクション、メッセージ レベルのセキュリティ (WS-Security など)、ピアツーピア メッセージング、HTTP または HTTPS 以外のトランスポートなど、より高度なバインディングおよびバインディング要素は、Silverlight 3 には用意されていません。

WCF で提供されている WebHttpBinding に類似した機能は用意されていません。純粋な HTTP、REST、RSS/Atom、または AJAX サービスに Silverlight 3 からアクセスするには、WebClient クラスなどの「HTTP および REST ベースのサービスへの直接アクセス」で説明されている手法を使用します。ASP.NET AJAX サービスにアクセスする方法については、「ASP.NET AJAX サービスへのアクセス」を参照してください。

データ転送とシリアル化

接続されたシステムでは、サービスとクライアントのタスクの実行は、データの交換に依存します。このデータは、XML や JSON などのさまざまな形式でネットワーク上に送信でき、送受信時にさまざまな .NET 型との変換を行うことができます。このプロセスは、シリアル化または逆シリアル化と呼ばれ、「データ転送とシリアル化」で詳しく説明されています。

Silverlight 3 のシリアル化のサポートは、主として WCF のシリアル化技術を基盤とします。ただし、Silverlight アプリケーションの開発者が理解しておく必要があるいくつかの相違点について、以下のセクションで説明します。

前のセクションで説明されている方法で WCF チャネル スタックを使用してサービスにアクセスする際は、XML のみがデータ形式として使用されます。このとき、DataContractSerializer または XmlSerializer (以下のセクションで説明) のいずれかを使用します。ただし、Silverlight にはシリアライザーについてその他の使用法があります。その場合、シリアル化機能を制御する規則は次のように異なります。

  • DataContractSerializer (XML 形式) は、Silverlight 分離ストレージにオブジェクトを格納するときに使用されます。

  • DataContractJsonSerializer (JSON 形式) は、Silverlight コントロール間の通信の複数の側面、および ScriptObject クラスを使用する場合などの HTML ページのホストに使用されます。

  • シリアライザーを直接使用して、XML または JSON データを生成および解析することもできます。これは、「XML データの使用」および「JSON データの使用」で説明されているように、HTTP/REST サービスを使用する場合に役に立ちます。

データ コントラクトのシリアル化

DataContractSerializer (XML 用) および DataContractJsonSerializer (JSON 用) は、Silverlight 3 の主要なシリアライザーで、ほとんどすべての .NET 型を操作できます。パブリック型では、マークされていない場合を除き、すべてのパブリック フィールドおよびプロパティが XML または JSON にそれぞれシリアル化されます。ほとんどのコレクション型は XML 配列または JSON 配列となります。XML 要素名の変更など、シリアル化をカスタマイズするには、DataContractAttributeDataMemberAttributeCollectionDataContractAttribute などを使用できます。サポートされるすべての型およびシリアル化の規則の一覧については、「データ コントラクト シリアライザーでサポートされる型」、「データ コントラクトの使用」、および「JSON などのデータ転送形式のサポート」を参照してください。

Silverlight 3 と WCF では、次の点が大きく異なります。

  • 通常、シリアライザーは、パブリック型とパブリック メンバーのみを使用できます。これは、部分信頼モードでの WCF の動作と同じです。ただし、例外が 1 つあります。型を含むアセンブリが InternalsVisibleToAttribute を使用して System.Runtime.Serialization.dll および System.ServiceModel.Web.dll アセンブリへのアクセスを許可する場合、内部型および内部メンバーを使用できます。

  • WCF System.Runtime.Serialization.IExtensibleDataObject インターフェイスは、Silverlight 3 ではサポートされません。

  • シリアル化のコールバック (OnSerializingOnSerializedOnDeserializingOnDeserialized 属性) は Silverlight 3 ではサポートされません。

  • 多くのビルトイン .NET Framework 型は、System.SerializableAttribute が適用されているため、WCF でシリアル化できます。このメカニズムは Silverlight 3 には存在しないため、このような型の多くはシリアル化できないか、WCF と互換性のある方法でシリアル化することはできません。このため、これらの型は生成されたプロキシで再利用できません。たとえば、サービスが System.Net.IPAddress 型を返す場合、"サービス参照の追加" を使用して生成された Silverlight クライアント プロキシは、この型が Silverlight に存在し、型の再利用がツールの [詳細設定] ダイアログ ボックスで有効にされている場合でも、この型を使用しません。代わりに、新しい型が生成されます。

  • コレクション型を生成するとき、Silverlight 3 バージョンの "サービス参照の追加" ツールは、Web サービス呼び出しの結果をユーザー インターフェイス コンポーネントにバインドしやすくするために、既定で ObservableCollection を生成するように設定されています。これは、[詳細設定] ダイアログ ボックスで変更できます。

  • 以下も、Silverlight 3 ではサポートされていません。System.Runtime.Serialization.NetDataContractSerializer、スキーマのインポート/エクスポート、オブジェクトの最大クォータを設定した逆シリアル化、および従来の .NET Framework 3.0 オブジェクト参照機構 (ただし、「相互運用可能なオブジェクト参照」で説明されている最新の相互運用可能なオブジェクト参照機構は完全にサポートされます)。

  • WCF では、DataContractJsonSerializer は、「JSON と XML 間のマッピング」で説明されているように、JSON と XML 間での特別なマッピングを使用してシリアル化および逆シリアル化を行うことができます。Silverlight 3 では、DataContractJsonSerializer はこのマッピングをサポートしませんが、マッピング自体は、Silverlight 3 SDK の System.Runtime.Serialization.Json.dll アセンブリ内の JsonReaderWriterFactory クラスを通じて Silverlight 3 でサポートされます。これは、オブジェクトを JSON と XML の両方として表現できる必要があり、これらのオブジェクトの型を事前に知ることができない、高度なシナリオで役立ちます。

XmlSerializer

より複雑な XML または XML スキーマ構造 (XML 属性、複数の XML 要素から選択する概念など) を表現するには、DataContractSerializer では十分でないことがよくあります。このようなケースは、WCF 以外の SOAP サービス、またはより複雑な XML を使用するサードパーティの HTTP/REST サービスと相互運用する場合によく発生します。このような場合、Silverlight 3 は XmlSerializer をサポートします。一般に、生成または使用する XML が管理外のあらかじめ決定された形式に従う必要があるとわかっている場合は、XmlSerializer は使用するシリアライザーとして適切です。XmlSerializer を使用すると Silverlight XAP アプリケーション パッケージのサイズが増加することに注意してください。

参照しているサービスが必要とする場合、XmlSerializer"サービス参照の追加" ツールで自動的に選択されます。操作は必要ありません。

WCF での XmlSerializer のサポートについては、「XmlSerializer クラスの使用」および「XML シリアル化および SOAP シリアル化」で説明されています。

Silverlight 3 では、先行ドキュメントに記載された SOAP メッセージの生成はサポートされません。

メッセージ コントラクトの使用

Silverlight 3 ではメッセージ コントラクトがサポートされます。WCF の対応機能の説明については、「メッセージ コントラクトの使用」を参照してください。

ただし、メッセージ コントラクトでは SOAP ヘッダーがサポートされません。ヘッダーが WSDL で記述されている場合、これらは "サービス参照の追加" ツールによって生成されません。ただし、ヘッダーは、OperationContext クラス (IncomingMessageHeaders/OutgoingMessageHeaders プロパティ) を通じて Silverlight 3 でサポートされます。

メタデータ

  • Silverlight 3 では、WSDL 1.1 および XML スキーマのサブセットがサポートされます。その他のメタデータ形式は、現時点ではサポートされていません。

  • プログラムによる WSDL のインポートまたはエクスポートはサポートされません。

  • Windows Communication Foundation (WCF) Svcutil.exe ツールを使用して、メタデータをダウンロードし、Silverlight クライアント コードを生成することはできません。代わりに、Visual Studio 2008 の "サービス参照の追加" 機能を使用します。

配信

Silverlight の配信サポートは、System.ServiceModel.Syndication.dll 拡張機能アセンブリの型を参照することによって有効になります。

Silverlight 3 の配信サポートは、主として WCF 配信オブジェクト モデルを基盤とします。次の WCF リソースには、WCF の配信機能セットの詳細な説明があります。

Silverlight では、WCF 配信オブジェクト モデルのサブセットが公開され、また、Silverlight が対象とするシナリオと WCF プラットフォームが対象とするシナリオは同じではありません。WCF では、データを配信フィードとして公開する Web サービスの作成がサポートされます。Silverlight は、ブラウザーベース アプリケーションから既存フィードへのアクセスをサポートするクライアント技術です。先行する発行記事の一部は、Silverlight のコンテキストに関係しません。

今回の Silverlight 3 リリースでは、2 つの主要な配信シナリオが実現されています。

  • SyndicationFeed クラスに対する HTTP 要求によって取得される RSS または Atom フィードの逆シリアル化 (解析)

  • RSS または Atom フィードへの SyndicationFeed クラスのインスタンスのシリアル化、および HTTP を使用したその送信

AJAX の統合と JSON のサポート

Silverlight 3 によってサポートされている機能は、以下に示す機能のみです。

  • DataContractJsonSerializer を使用した JSON のシリアル化。

  • System.Runtime.Serialization.Json.dll 拡張機能アセンブリの JsonReaderWriterFactory を使用した、ストリームまたはバッファーから JSON でエンコードされたデータを読み取り、XML Infoset にマップするためのリーダー クラスの生成、あるいは XML Infoset を JSON にマップし、JSON でエンコードされたデータをストリームに書き込むためのライター クラスの生成。

このトピックに関するコメントを Microsoft に送信する。

Copyright© 2009 by Microsoft Corporation. All rights reserved.