2012-11-23 14 views
5

ストリーミング転送モードでWCFバインディングを使用しています。バイナリコンテンツをサービスとの間でアップロードおよびダウンロードするために使用しています。私はそれを働かせることができた。私は設定のために、契約書などを参考にします。WCFとMTOMによるストリーミング

さまざまなバインディングとエンコーディングをベンチマークするためにいくつかのテストを行いました。結果のアップロードは大丈夫です。 NetTcpが最も速く、続いてBasicHttp-MTOM、次にBasicHttp-Textが続きます。大きなファイルをダウンロードするとき、MTTは、NetTcpでBasicHttpとバイナリエンコーディングを使用するテキストエンコーディングとは対照的に、非常に遅いです。

何か不足していますか?なぜBasicHttp-MTOMがアップロード時に他のバインディングよりも遅く動作するのですか?それに私はダウンロードのためにダブルバッファリングを実装しました。これは、MTOMエンコーディングでBasicHttpを除くすべてのバインドでもうまくいきます。 MTOMを使用するときにダブルバッファリングが役立たないのはなぜですか?

お読みいただきありがとうございます、これに関するアドバイスとアイデア。

試験結果:

サービスに150メガバイトバイナリデータをアップロード。クライアントは150 MBのファイルからファイルストリームを作成し、サーバーに渡します。サーバーはストリームをメモリストリームに読み込みます。ダブルバッファはまだありません。ファイルシステムへのデータの書き込みがないので、結果は速く見えます。そしてバインディングは期待通りに機能します。 100メガバイトにサービスからバイナリデータをダウンロード

Upload

。サービスはメモリストリームを作成し、クライアントに渡します。クライアントがファイルシステムに書き込みます。ここでは、シングルバッファとダブルバッファの両方の結果があります。ご覧のとおり、 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> 

クライアント構成:(簡単にするためにいくつかの部分を残し)

Download

Server構成

<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; } 
} 


編集:これは、職場での私の開発環境のセットアップに問題があることが判明しました。家で同じテストを行ったところ、結果は期待どおりでした。

Download

+0

そのダブルバッファニースキャッチあなたは、共有リンク(トーマス・レベスクとの1)で、何のパフォーマンスの差がないことが述べられているが、 1つのテストでも10%遅くなっています(使い方は異なりますが、まだシングル/ダブルのパフォーマンス差が大きすぎます)。 – sotn

答えて

関連する問題