WCF错误使用SSL时/ TLS

问题描述:

我们有一个使用一个HTTP绑定对客户端此配置的应用程序:WCF错误使用SSL时/ TLS

<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的失败请求追踪信息,发现列出的“请求实体太大”以及当时正在传输的数据,但我们不确定如何解释我们所看到的内容。

我们不知道客户为什么发行FIN?这是正常的吗?它是服务器上“请求实体太大”错误的原因,还是相反。或者只是巧合?无论哪种方式,效果是我们不得不在当时重新启动文件传输。任何想到什么可能是错误的根源?

在此先感谢您的帮助。

+0

发送的文件有多大?最糟糕的情况是什么?我得到的是你的maxReceivedMessageSize或maxBufferSize –

+0

最大文件大小实际上约为4GB,但我们想设置极限为8GB以防万一。我们将最大缓冲区大小设置为65536.我们已经看到的一件事是,将uploadReadAheadSize设置为更大的数值会很有帮助,但不能将其设置为大于2GB左右,这对于真正的大文件无效。 –

+0

还有一点需要注意的是,即使我们希望传输的最大文件大小是4GB,它也会是二进制编码的数据,我相信它会将文件大小扩大到5GB以上。 –

因此,自从我触及WCF已经有一段时间了,但我认为我找到了一个可能的事情。您的问题可能不是WCF,而是可能是IIS。在做了一些调查之后,由于请求大小,您可能会遇到SSL证书问题。

这其他的SO答案是很好看的,虽然它只是部分地涉及您的问题:

IIS7 - (413) Request Entity Too Large | uploadReadAheadSize

如果你坚持,它可能是值得一试就启用客户端协商的SSL IIS框。复制/意大利面代码,以防万一在发生故障时发生:

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

的netsh HTTP显示的sslcert

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

要删除当前设置(你不能改变现有的设置,您必须删除并重新进行添加) netsh的HTTP删除的sslcert:

的IP地址和端口从show命令得到的结果。 实施例:netsh的HTTP DELETE的sslcert 0.0.0.0:443

要在正确地添加证书设置回: netsh的HTTP添加的sslcert ipport =:CERTHASH = APPID = certstorename = clientcertnegotiation =启用

原始文章:

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

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