【发布时间】:2016-03-29 19:25:47
【问题描述】:
我们有一个使用 http 绑定的应用程序,该绑定在客户端具有此配置:
<binding name="SecureStreamedHttpBinding"
transferMode="Streamed"
maxReceivedMessageSize="8000000000"
maxBufferSize="65536"
sendTimeout="00:20:00">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
而服务器端的这个配置:
<binding name="SecureStreamedHttpBinding_IHub"
transferMode="Streamed"
maxReceivedMessageSize="8000000000"
maxBufferSize="65536"
receiveTimeout="00:20:00">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
客户端通过创建 ChannelFactory 然后调用 CreateChannel 来打开通道:
ChannelFactory<IHub> channelFactory = new ChannelFactory<IHub>(endpointConfigurationName);
IHub hub = channelFactory.CreateChannel();
((IClientChannel)hub).Open();
有时当我们尝试通过此连接传输大文件时,我们会从服务器收到错误消息:“远程服务器返回了意外响应:(413) 请求实体太大。”我说有时是因为似乎有许多时间/速度因素会导致错误来来去去。例如,错误似乎在具有高带宽的机器上更为普遍。在建立连接后很好地开始时,它们似乎不太普遍。然而,时间/速度的影响是不一致的。
如果关闭 TLS,我们就不会遇到任何问题。
我们对连接进行了 Wire Sharked,发现客户端在错误发生的大约同一时间在端口上发送“FIN”消息,但我们不知道 413 错误发生的确切时间,因为我们不知道在 Wire Shark 中看到它。所以,我们不知道这是因还是果。
我们还查看了来自 IIS 的 Failed Request Tracing 信息,发现“请求实体太大”与当时正在传输的数据一起列出,但我们不确定如何解释我们看到的内容。
我们不知道客户端为什么发出 FIN?这正常吗?是服务器上“请求实体太大”错误的原因,还是相反。还是只是巧合?无论哪种方式,效果都是我们必须在那时重新启动文件传输。有没有想过错误的根本原因是什么?
提前感谢您的帮助。
【问题讨论】:
-
发送的文件有多大?最坏的情况是什么?我得到的是你的 maxReceivedMessageSize 或 maxBufferSize
-
最大文件大小实际上是 4gb 左右,但我们想将限制设置为 8gb 以防万一。我们将最大缓冲区大小设置为 65536。我们看到的一件事是,将 uploadReadAheadSize 设置为更大的数字会很有帮助,但您不能将其设置为大于 2gb 左右,因此这对真正的大文件没有帮助。
-
还有一点需要注意的是,即使我们希望传输的最大文件大小是 4gb,它也会是二进制编码的数据,我相信这会将文件大小扩大到 5gb 以上。
标签: c# wcf ssl tls1.2 http-status-code-413