Windows Communication Foundation (WCF) は、XML ベースの通信インフラストラクチャです。 XML データは XML 1.0 仕様で定義されている標準テキスト形式でエンコードされるのが一般的であるため、接続システムの開発者やアーキテクトは通常、ネットワーク経由で送信されるメッセージのワイヤ フットプリント (またはサイズ) を気にしており、XML のテキスト ベースのエンコードは、バイナリ データを効率的に転送するための特別な課題をもたらします。
基本的な考慮事項
WCF の次の情報に関する背景情報を提供するために、このセクションでは、一般的に接続されたシステム インフラストラクチャに適用されるエンコード、バイナリ データ、ストリーミングに関する一般的な懸念事項と考慮事項について説明します。
データのエンコード: テキストとバイナリ
一般的に表現される開発者の懸念としては、開始タグと終了タグの繰り返しの性質により、XML がバイナリ形式と比較すると大きなオーバーヘッドが発生する、数値のエンコードがテキスト値で表されるために大幅に大きいと見なされる、バイナリ データをテキスト形式に埋め込むには特別にエンコードする必要があるため効率的に表現できない、という認識が含まれます。
これらの問題と同様の懸念事項の多くは有効ですが、XML Web サービス環境の XML テキスト でエンコードされたメッセージと、従来のリモート プロシージャ コール (RPC) 環境でのバイナリ エンコード メッセージの実際の違いは、多くの場合、最初の考慮事項が示唆するよりもはるかに重要ではありません。
XML テキスト でエンコードされたメッセージは透過的で "人間が判読できる" のに対し、バイナリ メッセージは比較でかなりわかりにくく、ツールがないとデコードが困難なことがよくあります。 この読みやすさの違いは、バイナリ メッセージもペイロードにインライン メタデータを含むことが多く、XML テキスト メッセージと同様にオーバーヘッドが増加することを見落とします。 これは、疎結合および動的呼び出し機能を提供することを目的とするバイナリ形式に特に当てはまります。
ただし、バイナリ形式では、通常、このような記述メタデータ情報が "ヘッダー" に格納され、次のデータ レコードのデータ レイアウトも宣言されます。 その後、ペイロードは、この一般的なメタデータ ブロック宣言に従い、オーバーヘッドを最小限に抑えます。 これに対し、XML は要素または属性で各データ項目を囲み、囲むメタデータがシリアル化されたペイロード オブジェクトごとに繰り返し含まれるようにします。 その結果、テキストとバイナリ表現を比較する場合、1 つのシリアル化されたペイロード オブジェクトのサイズは似ていますが、バイナリ形式は、両方に対して記述する必要があるためです。ただし、バイナリ形式は、全体的なオーバーヘッドが低いために転送される各追加ペイロード オブジェクトと共有メタデータの説明の利点があります。
ただし、数値などの特定のデータ型では、固定サイズのバイナリ数値表現 (プレーン テキストの代わりに 128 ビットの 10 進型など) を使用する場合、不都合があります。プレーン テキスト表現は数バイト小さい場合があるためです。 テキスト データには、通常より柔軟な XML テキスト エンコードの選択肢からサイズの利点がある場合もありますが、一部のバイナリ形式では既定で 16 ビットまたは 32 ビット Unicode に設定される場合があり、これは .NET バイナリ XML 形式には適用されません。
その結果、バイナリ メッセージが XML テキスト メッセージよりも常に小さいと仮定した場合ほど、テキストとバイナリのどちらを決定するかは容易ではありません。
XML テキスト メッセージの明確な利点は、標準ベースであり、相互運用性オプションとプラットフォーム サポートの選択肢が最も広い点です。 詳細については、このトピックで後述する「エンコード」セクションを参照してください。
バイナリ コンテンツ
メッセージ サイズの観点からテキスト ベースのエンコードよりもバイナリ エンコードが優れている領域の 1 つは、画像、ビデオ、サウンド クリップなどの大きなバイナリ データ項目、またはサービスとそのコンシューマー間で交換する必要がある不透明なバイナリ データです。 これらの種類のデータを XML テキストに収めるために、一般的な方法は、Base64 エンコードを使用してエンコードすることです。
Base64 でエンコードされた文字列では、各文字は元の 8 ビット データの 6 ビットを表します。その結果、Base64 のエンコードオーバーヘッド比は 4:3 になります。通常、規則によって追加される追加の書式設定文字 (復帰/改行) はカウントされません。 XML エンコードとバイナリ エンコードの違いの重要性は、通常、シナリオによって異なりますが、通常、500 MB のペイロードを送信する場合、33% を超えるサイズ ゲインは許容されません。
このエンコードのオーバーヘッドを回避するために、メッセージ転送最適化メカニズム (MTOM) 標準では、メッセージに含まれる大きなデータ要素を外部化し、特別なエンコードを行わずにバイナリ データとしてメッセージと共に伝達できます。 MTOMでは、メッセージは添付ファイルまたは埋め込みコンテンツ(画像およびその他の埋め込みコンテンツ)を含む簡易メール転送プロトコル(SMTP)電子メールメッセージと同様の方法で交換されます。MTOM メッセージは、ルート部分が実際の SOAP メッセージであるマルチパート/関連 MIME シーケンスとしてパッケージ化されます。
MTOM SOAP メッセージは、エンコードされていないバージョンから変更され、それぞれの MIME 部分を参照する特別な要素タグが、バイナリ データを含むメッセージ内の元の要素の代わりに使用されます。 その結果、SOAP メッセージは、一緒に送信された MIME パーツを指すことによってバイナリ コンテンツを参照しますが、それ以外の場合は XML テキスト データのみを伝送します。 このモデルは確立された SMTP モデルと密接に連携しているため、多くのプラットフォームで MTOM メッセージをエンコードおよびデコードするための広範なツールサポートが用意されているため、非常に相互運用可能な選択肢となります。
それでも、Base64 と同様に、MTOM には MIME 形式に必要なオーバーヘッドも伴います。そのため、MTOM を使用する利点は、バイナリ データ要素のサイズが約 1 KB を超える場合にのみ表示されます。 オーバーヘッドのため、バイナリ ペイロードがそのしきい値を下回っている場合、MTOM でエンコードされたメッセージは、バイナリ データに Base64 エンコードを使用するメッセージよりも大きくなる可能性があります。 詳細については、このトピックで後述する「エンコード」セクションを参照してください。
大きなデータ コンテンツ
ワイヤーフットプリントはさておき、前述の 500 MB のペイロードも、サービスとクライアントにとって大きなローカルの課題となります。 既定では、WCF は バッファー モードでメッセージを処理します。 つまり、メッセージの内容全体は、送信前または受信後にメモリ内に存在します。 これはほとんどのシナリオに適した戦略であり、デジタル署名や信頼性の高い配信などのメッセージング機能に必要ですが、大きなメッセージはシステムのリソースを使い果たす可能性があります。
大きなペイロードに対処するための戦略はストリーミングです。 特に XML で表現されるメッセージは、比較的コンパクトなデータ パッケージと考えられますが、メッセージのサイズは数ギガバイトで、データ パッケージよりも連続するデータ ストリームに似ている可能性があります。 データがバッファー モードではなくストリーミング モードで転送されると、送信者はメッセージ本文の内容をストリームの形式で受信者に提供し、メッセージ インフラストラクチャは、使用可能になると、送信者から受信者にデータを継続的に転送します。
このような大規模なデータ コンテンツ転送が発生する最も一般的なシナリオは、次のようなバイナリ データ オブジェクトの転送です。
メッセージ シーケンスに簡単に分割することはできません。
タイムリーに配信する必要があります。
転送が開始されると、完全には使用できません。
これらの制約がないデータの場合は、通常、1 つの大きなメッセージよりもセッションのスコープ内でメッセージのシーケンスを送信することをお勧めします。 詳細については、このトピックで後述する「ストリーミング データ」セクションを参照してください。
大量のデータを送信する場合は、 maxAllowedContentLength
IIS 設定 (詳細については、「 IIS 要求制限の構成」を参照) と maxReceivedMessageSize
バインディング設定 ( System.ServiceModel.BasicHttpBinding.MaxReceivedMessageSize や MaxReceivedMessageSize など) を設定する必要があります。
maxAllowedContentLength
プロパティの既定値は 28.6 MB、maxReceivedMessageSize
プロパティの既定値は 64 KB です。
エンコーディング
エンコードは、ネットワーク上でメッセージを表示する方法に関する一連のルールを定義します。 エンコーダーはこのようなエンコードを実装し、送信側では、インメモリ Messageを、ネットワーク経由で送信できるバイト ストリームまたはバイト バッファーに変換します。 受信側では、エンコーダーはバイトシーケンスをメモリ内メッセージに変換します。
WCF には 3 つのエンコーダーが含まれており、必要に応じて独自のエンコーダーを記述してプラグインできます。
各標準バインドには事前構成済みのエンコーダーが含まれています。これにより、Net* プレフィックスを持つバインドではバイナリ エンコーダー ( BinaryMessageEncodingBindingElement クラスを含む) が使用され、 BasicHttpBinding クラスと WSHttpBinding クラスではテキスト メッセージ エンコーダー ( TextMessageEncodingBindingElement クラスを使用) が既定で使用されます。
エンコーダー バインド要素 | 説明 |
---|---|
TextMessageEncodingBindingElement | テキスト メッセージ エンコーダーは、すべての HTTP ベースのバインドの既定のエンコーダーであり、相互運用性が最も重要なすべてのカスタム バインドに適しています。 このエンコーダーは、バイナリ データに対する特別な処理なしで、標準の SOAP 1.1/SOAP 1.2 テキスト メッセージを読み書きします。 メッセージの System.ServiceModel.Channels.MessageVersion プロパティが MessageVersion.None に設定されている場合、SOAP エンベロープ ラッパーは出力から省略され、メッセージ本文の内容のみがシリアル化されます。 |
MtomMessageEncodingBindingElement | MTOM メッセージ エンコーダーは、バイナリ データの特別な処理を実装するテキスト エンコーダーであり、厳密にはケース バイ ケースの最適化ユーティリティであるため、標準バインディングでは既定では使用されません。 MTOM エンコードによってメリットが得られるしきい値を超えるバイナリ データがメッセージに含まれている場合、データはメッセージ エンベロープに続く MIME パーツに外部化されます。 このセクションで後述する MTOM の有効化を参照してください。 |
BinaryMessageEncodingBindingElement | バイナリ メッセージ エンコーダーは、Net* バインディングの既定のエンコーダーであり、両方の通信相手が WCF に基づいている場合は常に適切な選択です。 バイナリ メッセージ エンコーダーでは、.NET バイナリ XML 形式を使用します。これは、通常、同等の XML 1.0 表現よりもフットプリントが小さく、バイナリ データをバイト ストリームとしてエンコードする XML 情報セット (Infoset) 用の Microsoft 固有のバイナリ表現です。 |
通常、テキスト メッセージ エンコードは相互運用性を必要とする通信パスに最適な選択肢ですが、バイナリ メッセージ エンコードは他の通信パスに最適な選択肢です。 バイナリ メッセージ エンコードでは、通常、1 つのメッセージのテキストと比較してメッセージ サイズが小さくなり、通信セッションの期間中はメッセージ サイズが徐々に小さくなります。 テキスト エンコードとは異なり、バイナリ エンコードでは、Base64 などのバイナリ データに対して特別な処理を使用する必要はありませんが、バイトをバイトとして表します。
ソリューションで相互運用性を必要としないが、引き続き HTTP トランスポートを使用する場合は、トランスポートに HttpTransportBindingElement クラスを使用するカスタム バインドにBinaryMessageEncodingBindingElementを作成できます。 サービス上の多数のクライアントで相互運用性が必要な場合は、それぞれのクライアントに対して適切なトランスポートとエンコードの選択肢が有効になっている並列エンドポイントを公開することをお勧めします。
MTOM の有効化
相互運用性が要件であり、大きなバイナリ データを送信する必要がある場合、MTOM メッセージ エンコードは、それぞれのMessageEncoding
プロパティをMtomに設定するか、MtomMessageEncodingBindingElementをCustomBindingに構成することで、標準のBasicHttpBindingまたはWSHttpBinding バインディングで有効にできる代替のエンコード方法です。
MTOM エンコード サンプルから抽出された次のコード例は、構成で MTOM を有効にする方法を示しています。
<system.serviceModel>
…
<bindings>
<wsHttpBinding>
<binding name="ExampleBinding" messageEncoding="Mtom"/>
</wsHttpBinding>
</bindings>
…
</system.serviceModel>
前述のように、MTOM エンコードを使用するかどうかは、送信するデータ ボリュームによって異なります。 また、MTOM はバインディング レベルで有効になっているため、MTOM を有効にすると、特定のエンドポイントのすべての操作に影響します。
MTOM エンコーダーは、バイナリ データが外部化されるかどうかに関係なく、MTOM でエンコードされた MIME/マルチパート メッセージを常に出力するため、通常は、1 KB を超えるバイナリ データでメッセージを交換するエンドポイントに対してのみ MTOM を有効にする必要があります。 また、MTOM 対応エンドポイントで使用するように設計されたサービス コントラクトは、可能な場合は、そのようなデータ転送操作の指定に制限する必要があります。 関連する制御機能は、別のコントラクトに存在する必要があります。 この "MTOM 専用" ルールは、MTOM 対応エンドポイントを介して送信されたメッセージにのみ適用されます。MTOM エンコーダーは、受信した MTOM 以外のメッセージもデコードおよび解析できます。
MTOM エンコーダーを使用すると、他のすべての WCF 機能に準拠します。 セッションのサポートが必要な場合など、すべてのケースでこの規則を確認できない場合があることに注意してください。
プログラミング モデル
アプリケーションで使用する 3 つの組み込みエンコーダーに関係なく、バイナリ データの転送に関するプログラミング エクスペリエンスは同じです。 違いは、WCF がデータ型に基づいてデータを処理する方法です。
[DataContract]
class MyData
{
[DataMember]
byte[] binaryBuffer;
[DataMember]
string someStringData;
}
MTOM を使用する場合、上記のデータ コントラクトは次の規則に従ってシリアル化されます。
binaryBuffer
がnull
されず、Base64 エンコードと比較して MTOM の外部化オーバーヘッド (MIME ヘッダーなど) を正当化するのに十分なデータが個別に含まれている場合、データは外部化され、バイナリ MIME 部分としてメッセージと共に送信されます。 しきい値を超えない場合、データは Base64 としてエンコードされます。文字列 (およびバイナリではないその他のすべての型) は、サイズに関係なく、常にメッセージ本文内の文字列として表されます。
前の例に示すように、明示的なデータ コントラクトを使用するか、操作でパラメーター リストを使用するか、入れ子になったデータ コントラクトを持っているか、コレクション内のデータ コントラクト オブジェクトを転送するかに関係なく、MTOM エンコードへの影響は同じです。 バイト配列は常に最適化の候補であり、最適化のしきい値が満たされている場合に最適化されます。
注
データ コントラクト内で派生型 System.IO.Stream 使用しないでください。 ストリーム データは、次の「ストリーミング データ」セクションで説明されているストリーミング モデルを使用して伝達する必要があります。
データのストリーミング
転送するデータが大量にある場合、WCF のストリーミング転送モードは、メモリ内のメッセージ全体をバッファリングおよび処理する既定の動作に代わる実行可能な代替手段です。
前述のように、データをセグメント化できない場合、メッセージをタイムリーに配信する必要がある場合、または転送が開始されたときにデータがまだ完全に使用できない場合は、大きなメッセージ (テキストまたはバイナリ コンテンツを含む) に対してのみストリーミングを有効にします。
制約
ストリーミングが有効になっている場合、多数の WCF 機能を使用することはできません。
メッセージ本文のデジタル署名は、メッセージの内容全体に対してハッシュを計算する必要があるため、実行できません。 ストリーミングでは、メッセージ ヘッダーが構築および送信されるときにコンテンツを完全に使用できないため、デジタル署名を計算できません。
暗号化は、データが正しく再構築されたことを確認するためにデジタル署名に依存します。
リライアブル セッションでは、転送でメッセージが失われた場合に再配信のためにクライアントで送信されたメッセージをバッファーに格納する必要があり、メッセージが順序外で受信された場合にメッセージの順序を保持するためにサービス実装に渡す前に、サービスにメッセージを保持する必要があります。
これらの機能上の制約のため、ストリーミングにはトランスポート レベルのセキュリティ オプションのみを使用でき、信頼できるセッションを有効にすることはできません。 ストリーミングは、次のシステム定義バインディングでのみ使用できます。
NetTcpBindingとNetNamedPipeBindingの基になるトランスポートには、信頼性の高い配信と接続ベースのセッション サポートが固有であるため、HTTP とは異なり、これら 2 つのバインドは、実際にはこれらの制約の影響を最小限に抑えるだけです。
ストリーミングはメッセージ キュー (MSMQ) トランスポートでは使用できないため、 NetMsmqBinding または MsmqIntegrationBinding クラスでは使用できません。 メッセージ キュー トランスポートでは、メッセージ サイズが制限されたバッファー内のデータ転送のみがサポートされますが、他のすべてのトランスポートには、ほとんどのシナリオで実際のメッセージ サイズの制限はありません。
ピア チャネル トランスポートを使用する場合はストリーミングも使用できないため、 NetPeerTcpBindingでは使用できません。
ストリーミングとセッション
セッション ベースのバインディングを使用して呼び出しをストリーミングすると、予期しない動作が発生する可能性があります。 すべてのストリーミング呼び出しは、使用されているバインディングがセッションを使用するように構成されている場合でも、セッションをサポートしない単一チャネル (データグラム チャネル) を介して行われます。 セッション ベースのバインディングを介して複数のクライアントが同じサービス オブジェクトに対してストリーミング呼び出しを行い、サービス オブジェクトのコンカレンシー モードが単一に設定され、インスタンス コンテキスト モードが PerSession に設定されている場合、すべての呼び出しはデータグラム チャネルを通過する必要があるため、一度に処理される呼び出しは 1 つだけです。 その後、1 つ以上のクライアントがタイムアウトになる可能性があります。この問題を回避するには、サービス オブジェクトのインスタンス コンテキスト モードを PerCall に設定するか、コンカレンシーを [複数] に設定します。
注
使用可能な "セッション" は 1 つしかないため、この場合、MaxConcurrentSessions は無効です。
ストリーミングの有効化
ストリーミングは、次の方法で有効にすることができます。
ストリーミング モードで要求を送受信し、バッファー モード (StreamedRequest) で応答を受け入れて返します。
バッファー モードで要求を送信および受け入れ、ストリーム モード (StreamedResponse) で応答を受け入れて返します。
両方向のストリーミング モードで要求と応答を送受信します。 (Streamed)。
ストリーミングを無効にするには、転送モードを Buffered に設定します。これは、すべてのバインドの既定の設定です。 次のコードは、構成で転送モードを設定する方法を示しています。
<system.serviceModel>
…
<bindings>
<basicHttpBinding>
<binding name="ExampleBinding" transferMode="Streamed"/>
</basicHttpBinding>
</bindings>
…
</system.serviceModel>
コードでバインドをインスタンス化する場合は、バインドのそれぞれの TransferMode
プロパティ (またはカスタム バインドを作成している場合はトランスポート バインド要素) を、前述の値のいずれかに設定する必要があります。
機能に影響を与えずに、通信相手の両側で、要求と応答または双方向のストリーミングを有効にすることができます。 ただし、転送されるデータ サイズが非常に大きいので、通信リンクの両方のエンドポイントでストリーミングを有効にすることが正当であると常に想定する必要があります。 エンドポイントの 1 つが WCF と実装されていないクロスプラットフォーム通信の場合、ストリーミングを使用する機能はプラットフォームのストリーミング機能によって異なります。 もう 1 つのまれな例外は、クライアントまたはサービスがワーキング セットを最小限に抑える必要があり、小さなバッファー サイズしか割り当てられないメモリ消費型のシナリオです。
非同期ストリーミングの有効化
非同期ストリーミングを有効にするには、 DispatcherSynchronizationBehavior エンドポイントの動作をサービス ホストに追加し、その AsynchronousSendEnabled プロパティを true
に設定します。 また、送信側で真の非同期ストリーミングの機能を追加しました。 これにより、複数のクライアントにメッセージをストリーミングするシナリオでサービスのスケーラビリティが向上します。一部のクライアントでは、ネットワークの輻輳が原因で読み取りが遅い場合や、まったく読み取らない場合があります。 これらのシナリオでは、クライアントごとにサービス上の個々のスレッドをブロックしません。 サービスはこれによってこれまで以上のクライアントを処理できるようになり、スケーラビリティが向上します。
ストリーミング転送のプログラミング モデル
ストリーミングのプログラミング モデルは簡単です。 ストリーミング データを受信するには、単一の Stream 型指定された入力パラメーターを持つ操作コントラクトを指定します。 ストリーミング データを返す場合は、 Stream 参照を返します。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IStreamedService
{
[OperationContract]
Stream Echo(Stream data);
[OperationContract]
Stream RequestInfo(string query);
[OperationContract(OneWay=true)]
void ProvideInfo(Stream data);
}
前の例で Echo
操作はストリームを受け取って返すため、 Streamedを持つバインディングで使用する必要があります。 操作RequestInfo
では、Streamのみを返すので、StreamedResponseが最適です。 一方向操作は、 StreamedRequestに最適です。
次の Echo
または ProvideInfo
の操作に 2 番目のパラメーターを追加すると、サービス モデルはバッファーに格納された戦略に戻り、ストリームの実行時のシリアル化表現を使用します。 1 つの入力ストリーム パラメーターを持つ操作のみが、エンドツーエンドの要求ストリーミングと互換性があります。
この規則は、メッセージ コントラクトにも同様に適用されます。 次のメッセージ コントラクトに示すように、メッセージ コントラクトにはストリームである本文メンバーを 1 つだけ含めることができます。 ストリームと追加情報を通信する場合、この情報はメッセージ ヘッダーに含まれている必要があります。 メッセージ本文は、ストリーム コンテンツ専用に予約されています。
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
ストリーム転送が終了し、ストリームがファイルの末尾 (EOF) に達するとメッセージが閉じられます。 メッセージを送信するときに (値を返すか、操作を呼び出す)、 FileStream を渡すことができます。その後、WCF インフラストラクチャは、ストリームが完全に読み取られ、EOF に到達するまで、そのストリームからすべてのデータをプルします。 このような事前構築された Stream 派生クラスが存在しないソースのストリーム データを転送するには、そのようなクラスを構築し、そのクラスをストリーム ソースにオーバーレイし、引数または戻り値として使用します。
メッセージを受信すると、WCF は Base64 でエンコードされたメッセージ本文コンテンツ (または MTOM を使用する場合はそれぞれの MIME 部分) を介してストリームを構築し、コンテンツが読み取られた時点でストリームが EOF に到達します。
トランスポート レベルのストリーミングは、他のメッセージ コントラクト型 (パラメーター リスト、データ コントラクト引数、および明示的なメッセージ コントラクト) でも機能しますが、このような型指定されたメッセージのシリアル化と逆シリアル化にはシリアライザーによるバッファリングが必要であるため、そのようなコントラクトバリアントを使用することはお勧めしません。
大きなデータに関する特別なセキュリティに関する考慮事項
すべてのバインディングを使用すると、受信メッセージのサイズを制限して、サービス拒否攻撃を防ぐことができます。 たとえば、 BasicHttpBindingでは、受信メッセージのサイズを制限する System.ServiceModel.BasicHttpBinding.MaxReceivedMessageSize プロパティが公開されるため、メッセージの処理中にアクセスされるメモリの最大量も制限されます。 この単位はバイト単位で設定され、既定値は 65,536 バイトです。
大規模なデータ ストリーミング シナリオに固有のセキュリティ上の脅威は、受信側がストリーミングされることを予期したときにデータをバッファーに格納することで、サービス拒否を引き起こします。 たとえば、WCF では常にメッセージの SOAP ヘッダーがバッファーされるため、攻撃者はヘッダー全体で構成される大きな悪意のあるメッセージを構築して、データを強制的にバッファーに格納する可能性があります。 ストリーミングが有効になっている場合、受信側はメッセージ全体が一度にメモリ内にバッファリングされることを想定しないため、 MaxReceivedMessageSize
は非常に大きな値に設定される可能性があります。 WCF がメッセージを強制的にバッファーに格納すると、メモリ オーバーフローが発生します。
そのため、この場合、受信メッセージの最大サイズを制限するだけでは不十分です。 WCF がバッファーするメモリを制限するには、 MaxBufferSize
プロパティが必要です。 ストリーミングするときは、これを安全な値に設定 (または既定値のままに) することが重要です。 たとえば、サービスで最大 4 GB のファイルを受信し、ローカル ディスクに格納する必要があるとします。 また、一度に 64 KB のデータしかバッファーに格納できないような方法でメモリが制約されるとします。 次に、 MaxReceivedMessageSize
を 4 GB に設定し、 MaxBufferSize
を 64 KB に設定します。 また、サービス実装では、受信ストリームからのみ 64 KB のチャンクで読み取り、前のチャンクがディスクに書き込まれ、メモリから破棄される前に次のチャンクを読み取らないようにする必要があります。
また、このクォータは WCF によって行われるバッファリングのみを制限し、独自のサービスまたはクライアント実装で行うバッファリングから保護できないことを理解することも重要です。 セキュリティに関するその他の考慮事項の詳細については、「 データのセキュリティに関する考慮事項」を参照してください。
注
バッファー転送とストリーミング転送のどちらを使用するかは、エンドポイントごとにローカルに決定します。 HTTP トランスポートの場合、転送モードは、接続全体、またはプロキシ サーバーやその他の中継局に伝達されません。 転送モードの設定は、サービス インターフェイスの記述に反映されません。 WCF クライアントをサービスに生成した後、ストリーム転送で使用するサービスの構成ファイルを編集してモードを設定する必要があります。 TCP トランスポートと名前付きパイプ トランスポートの場合、転送モードはポリシー アサーションとして伝達されます。