【问题标题】:WCF error when using SSL / TLS使用 SSL/TLS 时出现 WCF 错误
【发布时间】: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


【解决方案1】:

所以,我已经有一段时间没有接触 WCF 了,但我想我发现了一件可能的事情。您的问题可能不是 WCF,而可能是 IIS。在进行一些调查后,您可能会因为请求大小而遇到 SSL 证书问题。

this other SO answer is a good read,虽然它只部分涵盖了您的问题:

IIS7 - (413) Request Entity Too Large | uploadReadAheadSize

如果您遇到困难,可能值得尝试为 IIS 框上的 SSL 启用客户端协商。从原始链接复制/粘贴代码以防万一出现故障:

错误消息中列出的原因之一是“Web 服务器无法为请求提供服务,因为它正在尝试协商客户端证书但请求实体太大”。该问题的解决方案是设置 clientcertnegotiation=enable 的值。在 IIS 7 上设置此设置有点复杂。以下但通过命令提示符运行:

netsh http 显示 sslcert

注意下一组命令需要这些设置。

要删除当前设置(您无法更改现有设置,您必须删除并重新添加) netsh http 删除 sslcert :

IP 地址和端口是从 show 命令结果中获得的。 示例:netsh http delete sslcert 0.0.0.0:443

要正确添加证书设置: netsh http add sslcert ipport=: certash= appid= certstorename= clientcertnegotiation=enable

原文:

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

另外,看看增加您的上传预读大小: http://www.iis.net/configreference/system.webserver/serverruntime

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多