2012-11-23 82 views
5

我正在使用WCF與流式傳輸模式進行綁定,以便將二進制內容上傳到服務或從服務中下載。我設法讓它工作。我將包括配置,合同等以供參考。使用WCF和MTOM進行流式傳輸

我做了一些測試來測試不同的綁定和編碼。上傳結果似乎沒問題。 NetTcp是最快的,然後是BasicHttp-MTOM,然後是BasicHttp-Text。令我感到驚訝的是,在下載大文件時,MTOM速度很慢,而不是使用BasicHttp進行文本編碼,而使用NetTcp進行二進制編碼。

我錯過了什麼嗎?爲什麼在上傳時,BasicHttp-MTOM的工作方式比其他綁定更慢?除此之外,我已經爲下載實施了雙緩衝。除了使用MTOM編碼的BasicHttp外,這也適用於所有綁定。爲什麼雙緩衝在使用MTOM時無濟於事?

感謝您的閱讀,對此的建議和想法。

測試結果:

將150 MB二進制數據上傳到服務。客戶端從一個150 MB文件創建一個文件流並傳遞給服務器。服務器將流讀入內存流。沒有雙重緩衝。結果似乎很快,因爲沒有數據寫入文件系統。綁定按預期執行。

Upload

下載100 MB從服務二進制數據。服務創建一個內存流並傳遞給客戶端。客戶端寫入文件系統。這裏是單緩衝和雙緩衝的結果。正如你所看到的, MTOM看起來非常慢,也不會對雙緩衝作出響應。

Download

服務器配置(省去一些零件爲簡單起見):

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


編輯:這原來是在工作中我的開發環境設置的問題。當我在家裏進行相同的測試時,結果如預期。

Download

+0

尼斯趕上與雙緩衝雖然您共享的鏈接(托馬斯·萊維斯克一)中指出,不存在性能差異通過使用它,甚至在一個測試中速度降低10%(使用情況不同,但仍然...單/雙之間的性能差異太大)。 – sotn

回答