C# WCF流文件上传300MB+;

C# WCF流文件上传300MB+;,c#,wcf,C#,Wcf,我在WCF流式传输文件时遇到了一点问题。我可以将小于300 MB的文件流式传输到服务器,但当我尝试使用300 MB或更大的文件时,我会得到一个大约60%的错误,即“已建立的连接已被主机中的软件中止”。此错误听起来像是在文件完成之前关闭了连接,但我找不到它 我拥有的客户端代码打开连接,调用Upload方法,等待返回,然后关闭连接。这适用于小文件 WCF服务器使用net.tcp绑定托管在Windows服务中。我尝试过改变缓冲区大小等,但仍然没有运气 我正在寻找一些帮助来追踪这个问题 服务器端绑定:

我在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
        };
客户端绑定:

        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
        };
I类用于文件流:

    [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;
阅读本文,我不认为
MaxBufferPoolSize
会是问题所在(但值得增加它以确保安全)。如果可以,请将其重置为200mb限制,然后再次测试


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

我不想在回答中提到这一点,但您是否也确定没有超过您指定的10分钟超时?