2

お客様のサイトでランダムなOutOfMemoryExceptionsとInsufficientMemoryExceptionsが発生しています。GZipMessageEncoderを使用してメッセージを圧縮します。(IIS 7.x圧縮オプション、およびバッファリングやGZipMessageEncoderに関するその他の問題を認識しています。)

WCFストリーミングを有効にしてみたかったのです。当社のWCFサービスには、次のような契約があります。

[OperationContract]     
DataSet GetDataSet(Guid someGUID, string someName, DataSet parameters);

MSDNのこの記事によると:

ストリーミングされたトランスポート全体で発生する操作は、最大で1つの入力または出力パラメーターとのコントラクトを持つことができます

明らかに、私たちの契約はWCFストリーミングの制限に違反しています。このコントラクトには3つの入力パラメーターがあります。

しかし、好奇心から、とにかくストリーミングを有効にしてみることにしました。web.configファイルとMyCSharpClient.configファイルを編集し、バインディングのトランスポートセクションに次の属性を挿入しました。

<httpTransport ... transferMode="Streamed">

驚いたことに、とにかくすべてが機能しているようです!スローされる例外はありません。GZipMessageEncoderに侵入して、バッファメソッドの代わりにストリームメソッドが呼び出されていることを確認できます。

それで、私の質問:入力パラメーターのWCF制限に違反する操作コンテキストでストリーミングトランスポートをセットアップできたのはなぜですか?MSDNストリーミング記事の強力な表現を考えると、これは単なる実装の詳細であり、この動作に依存してはならないと思います。

4

1 に答える 1

2

現在起こっていることは次のとおりです。HTTP トランスポートでストリーミングを有効にしたため、トランスポートは何もバッファリングしていません。トランスポートはMessageオブジェクトを受け取り、それをトランスポート ストリーム (XML ライターにラップ) に直接書き込みます。ただし、操作のパラメーターはシリアル化される前にバッファーに入れられるため、転送モードを「バッファー」に設定した場合のメモリ使用量を「支払う」ことになります。ネットワーク上での違いは、このサービスからの応答が Content-Length ヘッダーを持つ代わりにチャンクされることです (つまり、Transfer-Encoded: chunkedヘッダーがあり、それに応じて本文がフォーマットされます)。しかし、それは同じように機能します良い。

MSDN の記事の方が適切な言葉を選択できたと思います。操作でストリーミングを利用するには、単一のパラメーター (多くの場合は type StreamMessageまたは を実装する何らかの型) が必要IXmlSerializableです。しかし、単純なコントラクト (つまり[OperationContract] int Add(int x, int y)) も同様に機能します。そして、1 つのコントラクトが「通常の」操作とストリーミングを利用する操作を持つことは完全に有効であり、転送モードはエンドポイントごとに設定する必要があるため (および操作ごとではありません)、「単純な」操作でも機能する必要があります。

于 2012-06-12T04:10:53.910 に答える