WCF错误"这可能是因为在HTTPS情况下使用HTTP.SYS未正确配置服务器证书"

Sam*_*tte 70 xml wcf web-services wcf-security

我在使用从Windows服务到我的Web服务器上运行的WCF服务的WCF调用时遇到问题.这个电话已经工作了好几个星期,但后来突然停止了工作,此后一直没有工作.

我得到的例外是:

发生常规错误System.ServiceModel.CommunicationException:发出HTTP请求时发生错误

然后它说

这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书.这也可能是由客户端和服务器之间的安全绑定不匹配引起的.

我在两端使用的安全性是wsHttpBinding,没有任何加密.它也只是使用HTTP - 而不是HTTPS,所以我不确定它为什么抱怨HTTPS.

内部异常堆栈的其余部分是:

SystemNet.WebException:基础连接已关闭:发送时发生意外错误.---> System.IO.IOException:无法将数据写入传输连接:提供了无效参数.---> System.Net.Sockets.SocketException:在System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize [])的System.Net.Sockets.Socket.MultipleSend(BufferOffsetSize [] buffers,SocketFlags socketFlags)中提供了无效参数.缓冲区)

我还应该注意到,我的程序中发生这种情况的点是在Web服务调用的"执行"行 - 也就是说,只要我调用Web服务并将其传递给包装的DataContract对象,它炸毁.

所有这些服务正在做的是传递大量的XML(作为.NET对象传递给客户端的调用),然后它做了一些工作.可能正在传输大约100-200k的XML.我已经将两端数据大小的限制提高到超过6兆,但这似乎没有帮助.

有任何想法吗?


有关此问题的更多信息:

当我们在本地复制客户端环境时,我们发现除非我们进行以下更改,否则我们无法上传大量的XML:1.在服务器上,将"maxRequestLength"设置为100 MB(比我们发送的方式更高)2.在客户端,我们将dataContractSerializer标记下的maxItemsInObjectGraph的值设置为"2147483646".

通过这些更改,我们的本地安装成功上传.但是,客户端在其服务器上的安装仍然失败.有趣的是,一旦我们在服务器上更改了maxRequestLength值,我们的测试安装就会开始抛出一个与maxItemsInObjectGraph设置有关的错误.而在我们客户端的服务器上,仍然发生原始的"HTTP.sys"错误.

正如我之前提到的,我们根本没有使用SSL,还有2个其他Web服务调用以相同的方式执行和上传XML.但是,由于非工作服务呼叫传输更多数据,这似乎是一个大小问题.

但是,如果客户端遇到的问题与我们的测试安装相同,我不明白为什么客户端错误消息与ObjectGraph错误无关.

是否有可能我们只是为客户端上的每个可能的错误获取通用的"无效参数""HTTP.sys"错误(即它真的得到了objectGraph错误,但只是没有显示它?)

use*_*142 60

我们遇到此问题,因为主机服务器已更新为使用TLS V1.2,我们使用标准SSL进行连接.这是作为网站笔测试的一部分进行的更新.我们在代码连接中看到了这个问题,但是没有浏览器转到wsdl.代码解析如下:

if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

从这里开始:如何在.NET中禁用SSL回退并仅使用TLS进行出站连接?(贵宾犬缓解)

  • 2020。同样的解决方案。 (2认同)

小智 23

我在IIS 7上运行的服务上遇到同样的问题,当添加新的服务器时,服务连接到多个供应商服务器(有些SSL没有)(这个新供应商是TLS 1.2)我会在几个请求之后得到错误制作到原始服务器(SSL).

为了确认这一点,我只是System.Net.ServicePointManager.SecurityProtocol在每个请求之前记录每个供应商.

在重新启动服务(或重新启动应用程序池)之后,我会得到输出,Ssl3, Tls但是在向原始供应商服务器发出一些请求之后,这会改变,Ssl3并且对TLS服务的请求会产生错误.

要修复我只是做了user369142建议的内容.在每次请求新服务器之前:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)

没有更多的错误.


小智 9

有这个问题的真正的HTTPS绑定和相同的例外"这可能是由于服务器证书没有在HTTPS情况下使用HTTP.SYS正确配置......".在对代码和配置中的所有内容进行双重检查之后,似乎错误消息不像内部异常那样具有误导性,因此在快速检查之后我们发现端口443被skype(在开发服务器上)挂钩.我建议你看看阻止请求的内容(Fiddler可以在这里提供帮助),并确保你可以到达服务前端(查看浏览器中的.svc)及其元数据.

祝好运.


Ele*_*yce 7

在我的情况下,我必须启用SchUseStrongCrypto.Net这迫使服务器使用TLS 1.0,1.1或1.2建立连接.未SchUseStrongCrypto启用时,连接尝试使用SSL 3.0,该SSL已在远程端点上禁用.

用于启用强加密的注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
Run Code Online (Sandbox Code Playgroud)


Joe*_*ley 5

对我们来说,这个错误是因为运行该服务的开发人员的计算机已将IIS配置为仅在127.0.0.1上绑定端口443.

在IIS管理器中,右键单击该网站,然后选择"编辑绑定".如果端口条目443具有IP地址127.0.0.1,请将其更改为*.


Sot*_*nis 5

经过大量搜索并徒劳地取了主人的名字,我终于得到了它。我在运行wcf服务的服务器上安装了TLS 1.2。我的客户端配置正确,但是它是基于.NET 4.5.1构建的,而wcf在.NET 4.6.1上。如果您使用的是TLS 1.2,则客户端和服务器都必须使用相同的.NET版本。我希望有一天能对某人有所帮助:-)

  • 如果是这种情况,这将是一个错误,协议不应因 .NET 版本而异,更不用说甚至不使用 .NET 的服务或客户端。 (3认同)

小智 5

将您的客户端应用程序更改为4.5及更高版本。如果您是4.5,则根据需要使用:System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0,也可以将应用程序升级到4.6.1以上。


Tan*_*ner 1

我已经看到了与复杂数据类型问题相关的这些特殊异常,如果您要传递集合或枚举,请参阅以下帖子:

复杂数据类型

  • @SamSchutte:这个错误已经解决了吗?您能提供一下解决方案吗? (4认同)