3

大きなオブジェクトを返すサービスがありますが、デフォルトの転送モード (バッファリング) は要件に適合しません。

実際、サービスは既に作成されており、プロジェクト チームは断続的にメモリ不足の例外とパフォーマンスの低下を経験しています。プロジェクトチームが納品に近づいているため、すべてのサービスを書き直すことはできません。

transfermode を StreamedResponse/Streamed に変更すると、http バインディングの代わりに net.tcp を選択すること (シック クライアントを使用したイントラネット アプリケーション) が大いに役立つことを理解しています。すべての操作コントラクトで利益が得られるのか、それともストリーム/メッセージを返す操作コントラクトのみで利益が得られるのかを知る必要があります。

他の戻り値の型 (DataTable/DataSet) に影響があるかどうかを確認する小さなサンプルを作成しましたが、DataTable/DataSet を含むすべての戻り値の型に影響するようです。私はWCF HttpTransport: streamed vs buffered TransferModeをチェックしましたが、同じ動作が他の人にも経験されているようです。

ここに欠けている唯一のものは、戻り値の型に関係なくすべての操作契約に影響を与えることを明確に述べている具体的なドキュメントです。この変更に対する私の推奨事項をプッシュできるように、いくつかの参照が必要です。

サービスから DataTable/DataSet を返さないことを提案しないでください。私はそれが悪い習慣であり、常に避けるべきであることを知っていますが、この場合、サービスはすでに存在していたので、現時点ですべてを変更するように依頼することはできません.

更新: 私の認識は次のテストに基づいています

私のインターフェース

[ServiceContract]
public interface IMediaManager
{
    [OperationContract]
    Stream Play(int mediaId);

    [OperationContract]
    DataSet GetJunk();
}

私の実装

public class MediaManager : IMediaManager
{
    public Stream Play(int mediaId)
    {
        String path = GetMedia(mediaId);
        FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.Read);
        return fStream;
    }

    public DataSet GetJunk()
    {
        return GetLargeJunkDataSet20PlusMegs();
    }
}

IIS 経由でホスト - 非 Http WAS、サーバー構成ファイル (タグは削除され、関連するもののみ)

<system.serviceModel>
<services>
  <service name="MediaService.MediaManager" behaviorConfiguration="MediaServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:9876/MediaService/MediaManager.svc" />
      </baseAddresses>
    </host>
    <endpoint address="" binding="customBinding"
              bindingConfiguration="StreamedTcpBinding" name="MediaManagerTcp"
              contract="MediaService.IMediaManager" />
    <endpoint address="mexTcp" binding="mexTcpBinding" name="mexTcp"
              contract="IMetadataExchange" />
  </service>
</services>
<bindings>
  <customBinding>
    <binding name="StreamedTcpBinding" sendTimeout="00:10:00" receiveTimeout="00:10:00">
      <binaryMessageEncoding />
      <tcpTransport transferMode="Streamed" portSharingEnabled="true"  />
    </binding>
  </customBinding>
</bindings>

クライアント構成ファイル (関連するタグのみ)

<binding name="MediaManagerTcp" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
      transferMode="Streamed" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647"
      ***maxBufferSize="1001"*** maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="None">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>

上記の場合、maxBufferSizeは 1001 バイトですが、実際のメッセージは 20+ MB になります。これにより、Streamed が DataSet でも機能していると思われます (Stream と Message だけでなく、すべて)。私の解釈が maxBufferSize (1 つのチャンクで受信される最大サイズ) について正しいことを願っています。また、Buffered モードに切り替えると、同じ方法が失敗することも付け加えておく必要があります。

私の分析が理にかなっていることを願っています。明確でない場合はお知らせください。もう一度試してみますか?

迷子にならないようにもう一度質問を繰り返します:)

ここに欠けている唯一のものは、戻り値の型に関係なくすべての操作契約に影響を与えることを明確に述べている具体的なドキュメントです。この変更に対する私の推奨事項をプッシュできるように、いくつかの参照/経験が必要です。

どんな助けでも大歓迎です!

ありがとう、

4

1 に答える 1