簡體   English   中英

WCF流文件上傳300MB +

[英]WCF Streaming File Upload 300MB +

WCF流文件時遇到了一些麻煩。 我能夠將小於300 MB的文件流式傳輸到服務器,但是當我嘗試300 MB或更大的文件時,我說“已建立的連接被主機中的軟件中止了”時出現60%左右的錯誤。 這個錯誤聽起來像是我在文件完成之前關閉了連接,但是找不到它。

我擁有的客戶端代碼打開連接,調用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; }

    }

我收到的錯誤:

例外:套接字連接已中止。 這可能是由於處理您的消息時出錯,遠程主機超出了接收超時或潛在的網絡資源問題引起的。 本地套接字超時為'00:48:35.9230000'

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

內部異常:套接字連接已中止。 這可能是由於處理您的消息時出錯,遠程主機超出了接收超時或潛在的網絡資源問題引起的。 本地套接字超時為“ 00:48:35.9230000”。

內部例外:已建立的連接已被主機中的軟件中止

我在這里先向您的幫助表示感謝。

我認為這是因為您將MaxReceivedMessageSize (可能還有MaxBufferPoolSize )設置為大約194兆字節。 嘗試將其加倍到408006400 (約400mb)。

更改為此:

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

閱讀MSDN時 ,我認為MaxBufferPoolSize不會成為問題(但值得肯定的是增加它)。 如果可行,請將其重置為200mb的限制,然后再次測試。

發生這種情況的原因是,一旦服務器已達到204003200字節(194mb)的傳輸量,服務器就會中止傳輸,因為您指出的是最大預期大小。 這是設計使然,目的是防止有人上載非常大的文件來阻塞服務器時進行惡意使用,或者防止用戶過度使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM