サービスとの間でバイナリ コンテンツをアップロードおよびダウンロードするために、ストリーミング転送モードで WCF バインディングを使用しています。私はそれを機能させることができました。参考までに、構成、契約などを含めます。
さまざまなバインディングとエンコーディングをベンチマークするために、いくつかのテストを行いました。結果のアップロードは問題ないようです。NetTcp が最速で、次に BasicHttp-MTOM、次に BasicHttp-Text が続きます。驚いたことに、大きなファイルをダウンロードするとき、MTOM は、BasicHttp を使用したテキスト エンコーディングや NetTcp を使用したバイナリ エンコーディングとは対照的に、非常に遅いということです。
何か不足していますか?アップロード時に BasicHttp-MTOM の動作が他のバインディングよりも遅いのはなぜですか? それに加えて、ダウンロード用にダブル バッファリングを実装しました。これは、MTOM エンコーディングを使用する BasicHttp を除くすべてのバインディングでもうまく機能します。MTOM を使用する場合、ダブルバッファリングが役に立たないのはなぜですか?
読んでくれてありがとう、これについてのアドバイスとアイデア。
試験結果:
150 MB のバイナリ データをサービスにアップロードしています。クライアントは、150 MB のファイルからファイル ストリームを作成し、サーバーに渡します。サーバーはストリームをメモリ ストリームに読み込みます。ダブルバッファはまだありません。ファイルシステムへのデータの書き込みがないため、結果は高速に見えます。また、バインディングは期待どおりに機能します。
サービスから 100 MB のバイナリ データをダウンロードしています。サービスはメモリ ストリームを作成し、クライアントに渡します。クライアントがファイル システムに書き込みます。以下は、シングル バッファーとダブル バッファーの両方の結果です。ご覧のとおり、MTOM は非常に遅く、ダブル バッファリングにも反応しません。
サーバー構成 (簡単にするために一部を省略しています):
<configuration>
<system.web>
<httpRuntime maxRequestLength="2147483647"/>
</system.web>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="StreamedNetTcpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
messageEncoding="Mtom" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
<binding name="StreamedBasicHttpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
クライアント構成 (簡単にするために一部を省略):
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
maxReceivedMessageSize="1099511627776"
messageEncoding="Mtom" transferMode="Streamed">
</binding>
<binding name="StreamedBasicHttpBinding"
maxReceivedMessageSize="1099511627776"
transferMode="Streamed">
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="StreamedNetTcpBinding" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
サービス契約:
[ServiceContract]
public interface IFileService
{
[OperationContract]
void UploadFile(DocumentData document);
[OperationContract]
DocumentData DownloadFile();
}
メッセージ コントラクト:
[MessageContract]
public class DocumentData
{
[MessageHeader(MustUnderstand = true)]
public string DocumentName { get; set; }
[MessageHeader(MustUnderstand = true)]
public int FileLength { get; set; }
[MessageBodyMember(Order = 1)]
public Stream Data { get; set; }
}
編集:これは、職場での開発環境のセットアップの問題であることが判明しました。自宅で同じテストを実行したところ、結果は予想どおりでした。