[英]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.