2013-07-14 121 views
1

我在WCF流式傳輸文件時遇到了一些問題。我能夠將文件流式傳輸到服務器上,但少於300 MB,但是當我嘗試使用300 MB或更大的文件時,在「主機中的軟件中斷已建立的連接」時,出現大約60%的錯誤, 。這個錯誤聽起來像是我在文件完成之前關閉了連接,但是我找不到它。WCF流媒體文件上傳300MB +

客戶端代碼我打開連接,調用Upload方法,等待返回,然後關閉連接。這適用於小文件。

WCF服務器使用net.tcp綁定託管在Windows服務中。我試過改變緩衝區大小等,但仍然沒有運氣。

我在尋找一些幫助來追蹤這個問題。

服務器端綁定:

 NetTcpBinding tcp = new NetTcpBinding(SecurityMode.None); 
     tcp.SendTimeout = TimeSpan.FromMinutes(10); 
     tcp.ReceiveTimeout = TimeSpan.FromMinutes(10); 
     tcp.MaxBufferSize = 65536; // 16384; 
     tcp.MaxBufferPoolSize = 204003200; // 655360; 
     tcp.MaxReceivedMessageSize = 204003200; // 2147483647; 

     tcp.TransferMode = TransferMode.Streamed; 

     tcp.ReaderQuotas = new XmlDictionaryReaderQuotas() 
     { 
      MaxArrayLength = 2147483647 
     }; 

客戶端綁定:

 NetTcpBinding tcp = new NetTcpBinding(SecurityMode.None); 
     tcp.SendTimeout = TimeSpan.FromMinutes(10); 
     tcp.ReceiveTimeout = TimeSpan.FromMinutes(10); 
     tcp.MaxBufferSize = 65536; // 16384; 
     tcp.MaxBufferPoolSize = 204003200; // 655360; 
     tcp.MaxReceivedMessageSize = 204003200; // 2147483647; 
     tcp.TransferMode = TransferMode.Streamed;   

     tcp.ReaderQuotas = new XmlDictionaryReaderQuotas() 
     { 
      MaxArrayLength = 2147483647 
     }; 

類我使用這個文件流:

[MessageContract] 
    public class DataFileStream 
    { 

     [MessageHeader(MustUnderstand = true)] 
     public String ID { get; set; } 

     [MessageHeader(MustUnderstand = true)] 
     public String FileName { get; set; } 

     [MessageHeader(MustUnderstand = true)] 
     public long FileSize { get; set; } 


     [MessageBodyMember(Order = 1)] 
     public Stream StreamData { get; set; } 

    } 

而且錯誤我收到:

例外:襪子et連接被中止。這可能是由處理您的消息時出錯或遠程主機超出接收超時或基礎網絡資源問題引起的。本地套接字超時爲'00:48:35.9230000'

內部異常:寫入操作失敗,請參閱內部異常。

內部例外:套接字連接被中止。這可能是由處理您的消息時出錯或遠程主機超出接收超時或基礎網絡資源問題引起的。本地套接字超時爲'00:48:35.9230000'。

內部異常:一個已建立的連接被軟件在主機

感謝提前的幫助中止。

+0

不想在我的回答中提到這一點,但是您是否也確定自己沒有超過您指定的10分鐘超時時間? –

回答

0

我認爲這是因爲你有你的MaxReceivedMessageSize(可能MaxBufferPoolSize)設置爲大約194兆字節。嘗試加倍到408006400(約400mb)。

它改成這樣:

tcp.MaxBufferPoolSize = 408006400; 
tcp.MaxReceivedMessageSize = 408006400; 

MSDN,我不認爲MaxBufferPoolSize將是問題(但值得增加它,以確保公正)。如果這有效,將其重置爲200mb的限制並再次測試。

發生這種情況的原因是一旦服務器達到204003200字節(194mb)傳輸,服務器會中止傳輸,因爲您指出這是最大預期大小。這是爲了防止有人上傳一個非常大的文件以阻塞服務器或防止用戶過度使用時的惡意使用。