我正在使用WCF與流式傳輸模式進行綁定,以便將二進制內容上傳到服務或從服務中下載。我設法讓它工作。我將包括配置,合同等以供參考。使用WCF和MTOM進行流式傳輸
我做了一些測試來測試不同的綁定和編碼。上傳結果似乎沒問題。 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; }
}
編輯:這原來是在工作中我的開發環境設置的問題。當我在家裏進行相同的測試時,結果如預期。
尼斯趕上與雙緩衝雖然您共享的鏈接(托馬斯·萊維斯克一)中指出,不存在性能差異通過使用它,甚至在一個測試中速度降低10%(使用情況不同,但仍然...單/雙之間的性能差異太大)。 – sotn