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