2012-11-23 18 views
5

İki hizmetin bir servise/servise yüklenmesi ve yüklenmesi için WCF bağlamaları akış aktarımlı aktarım modunda kullanıyorum. Çalışmayı başardım. Referans için yapılandırma, sözleşmeler vb. Ekleyeceğim.WCF ve MTOM ile Akış

Farklı bağlamaları ve kodlamaları karşılaştırmak için bazı testler yaptım. Yükleme sonuçları iyi görünüyor. NetTcp en hızlı, ardından BasicHttp-MTOM ve daha sonra BasicHttp-Text. Beni şaşırtan şey, büyük dosyaları indirirken MTOM'un, BasicHttp ve NetTcp ile İkili kodlama ile kodlanan Metin'in aksine çok yavaş olmasıdır.

Bir şey mi eksik? Neden BasicHttp-MTOM, yükleme yaparken diğer bağlantılardan daha yavaş çalışıyor? Bunun yanında indirmeler için çift arabelleğe aldım. Bu, MTOM kodlaması ile BasicHttp dışındaki tüm bağlarla da iyi çalışır. MTOM kullanırken çift tamponlama neden yardımcı olmaz?

Bu konu hakkında okuma, tavsiye ve fikirleriniz için teşekkür ederiz.

Test Sonuçları:

servise 150 MB ikili veri yükleniyor. İstemci 150 MB'lik bir dosyadan bir dosya akışı oluşturur ve sunucuya geçer. Sunucu akışı bir bellek akışına okur. Henüz ikili tampon yok. Dosya sistemine veri yazılmaması nedeniyle sonuçlar hızlı görünmektedir. Ve bağlamalar beklendiği gibi gerçekleşir. 100 MB hizmetinden ikili veri indirme

Upload

. Servis bir bellek akışı oluşturur ve istemciye geçer. İstemci dosya sistemine yazar. İşte tek ve çift tamponlu sonuçları. Gördüğünüz gibi MTOM oldukça yavaş görünüyor ve çift arabelleğe de yanıt vermiyor. (Basitlik için bazı parçalar dışında kalan)

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

Müşteri yapılandırması: (basitlik için bazı parçalar dışında kalan)

Download

Sunucu yapılandırması

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

Hizmet Sözleşme:

[ServiceContract] 
public interface IFileService 
{ 
    [OperationContract] 
    void UploadFile(DocumentData document); 

    [OperationContract] 
    DocumentData DownloadFile(); 
} 

İleti Sözleşme:

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


Düzenleme: Bu işte benim geliştirme ortamı kurulumu ile ilgili bir sorun olduğu ortaya çıktı. Aynı testleri evde yürüttüğümde, sonuçlar beklendiği gibi oldu.

Download

+0

İyi tutuş paylaşılan linkte (Thomas Levesque ile bir) hiçbir performans fark olduğunu belirtti rağmen Testlerden birinde ve hatta% 10 daha yavaş kullanıldığında (kullanım farklıdır fakat yine de .. tek/çift arasında çok fazla performans farkı). – sotn

cevap