1

我在使用 WCF 流式传输文件时遇到了一点问题。我能够将小于 300 MB 的文件流式传输到服务器,但是当我尝试 300 MB 或更大的文件时,出现大约 60% 的错误,提示“已建立的连接已被主机中的软件中止” . 这个错误听起来好像我在文件完成之前关闭了连接,但我找不到它。

我的客户端代码打开连接,调用上传方法,等待返回,然后关闭连接。这适用于小文件。

WCF 服务器托管在 Windows 服务中,使用 net.tcp 绑定。我试过改变缓冲区大小等,但仍然没有运气。

我正在寻找一些帮助来追踪这个问题。

服务器端绑定:

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

内部异常:已建立的连接被主机中的软件中止

我在这里先向您的帮助表示感谢。

4

1 回答 1

0

我认为这是因为您的MaxReceivedMessageSize(并且可能MaxBufferPoolSize)设置为大约 194 兆字节。尝试将其加倍至408006400(约 400mb)。

将其更改为:

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

阅读MSDN,我认为这不是MaxBufferPoolSize问题(但值得增加它只是为了确保)。如果可行,请将其重置为 200mb 限制并再次测试。

发生这种情况的原因是,一旦服务器传输了 204003200 字节 (194mb),服务器就会中止传输,因为您指出这是最大的预期大小。这是为了防止恶意使用,即有人上传非常大的文件以阻塞服务器或防止用户过度使用。

于 2013-07-14T21:35:38.727 回答