WCF错误“这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书”


79

使用WCF调用从Windows服务到在Web服务器上运行的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 []缓冲区,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错误,但没有显示出来?)


您说它停止工作了,是否更改了可能导致此问题的任何代码或配置?您可以使用要传递的数据类型为正在调用的方法发布一些代码吗?
Tanner 2010年

我将其挖掘出来并发布。我想我基本上是在传递“ AppointmentData”对象的数组,这些对象在DataContract中定义。当然是复杂的对象,因此我将检查您的帖子。谢谢!
山姆·舒特

哦,没有代码或配置被更改-可以正常工作数周,然后才停止。客户端的防火墙设置也可能被更改了,但是奇怪的是正在进行WCF调用的服务可以调用其他2种WCF服务方法,并且还能够向我发送一封电子邮件,其中包含异常内容...因此在3个WCF调用中有2个调用,但不是最后一个。
山姆·舒特

2
我总是对“一般错误”持怀疑态度,因为这些错误通常会暗示一种可能性,因为您实际上并不知道该建议是否是鲱鱼。您可以通过设置安全性=无进行测试吗?如果服务电话有效,它会告诉我们证书(或至少是安全性)有问题。我也想在两侧看到配置。
Mike L 2010年

我得检查一下,但是我很确定安全性没有设置过……
Sam Schutte 2010年

Answers:


70

由于主机服务器已更新为使用TLS V1.2,并且我们使用标准SSL进行连接,因此出现了此问题。这是对站点笔测试的一部分进行的更新。我们在代码连接中看到了问题,但浏览器转到wsdl却没有。下列代码已解决:

if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

取自此处:如何禁用SSL回退并仅将TLS用于.NET中的出站连接?(缓解贵宾犬)


谢谢!这对我有帮助。如果从C ++应用程序调用C#DLL进行SOAP调用,则必须进行设置。如果从C#应用程序调用了相同的C#DLL,则不需要这样做。
像素

就我而言:a)我需要添加 using System.Net到文件中。b)SecurityProtocol的值为“默认”。我决定删除“ if”并分配SecurityProtocolType.Tls。SecurityProtocolType.Tls11 | 无需先询问即可获得SecurityProtocolType.Tls12。HTH,马塞洛
马塞洛·芬基

1
2020年。相同的解决方案。
Anton Krouglov

27

我在IIS 7上运行的服务上遇到了相同的问题,当添加其中一个新服务器(该新供应商是TLS 1.2)时,该服务连接到多个供应商服务器(某些SSL却没有)原始服务器(SSL)。

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

重新启动服务(或重新启动应用程序池)后看到低位,我会得到输出,Ssl3, Tls但是在对原始供应商服务器的一些请求更改为Ssl3TLS服务的请求后,出现了错误。

为了解决这个问题,我只是做了user369142建议的事情。在对新服务器的每次请求之前:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

没有更多的错误。


您至少需要.NET 4.5以上的版本才能使用TLS 1.2以上的版本。资料来源:blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
xx1xx'5

非常感谢,是否可以将其与整数一起用于枚举:System.Net.ServicePointManager.SecurityProtocol = 123 => enum1 | enum2等。对于其他框架?
MirlvsMaximvs

您无需在每个请求之前进行设置-只需在应用程序启动事件中对其进行一次设置-这是您要设置的静态属性。
user369142

9

发生了具有真正的HTTPS绑定的问题,并且出现了与“这可能是由于在HTTPS情况下未使用HTTP.SYS对服务器证书进行正确配置而造成的事实...”相同的例外。在仔细检查了代码和配置中的所有内容之后,错误消息似乎并没有引起内部异常那么误导,因此在快速检查之后,我们发现端口443被skype(在开发服务器上)钩住了。我建议您看一下阻止请求的内容(Fiddler可以在此处帮助您)并确保您可以到达服务前端(在浏览器中查看.svc)及其元数据。

祝好运。


9

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

注册表项可启用强加密:

[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

这为我们工作
哥斯塔

6

对我们而言,此错误是因为运行该服务的开发人员计算机将IIS配置为仅绑定127.0.0.1上的端口443。

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


5

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


2
如果真是这样,那就必须是一个错误,该协议不应基于.NET版本而有所不同,更不用说甚至没有使用.NET的服务或客户端了。
乔尔·麦克贝斯

这个提示解决了我的问题。我有一个WPF项目,并引用了另一个项目B。项目B为4.5.2,而WPF项目为4.6.1。使4.5.2都解决了问题。
伊格纳西奥(Ignacio Hagopian)

5

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


4

我们最近几乎发生了完全相同的问题,事实证明这是由于在调用计算机上安装了Microsoft更新KB980436(http://support.microsoft.com/KB/980436)引起的。除了直接卸载,我们的解决方法是按照KB网站上的说明将注册表中的UseScsvForTls DWORD设置为1。如果您看到此更新安装在您的呼叫系统中,则可能需要尝试一下。


您使用HTTPS打过电话吗?还是他们未加密为OP?
roufamatic 2011年

3

在Amazon AWS上同时针对IIS和glassfish运行较旧的XP SP3机器时,出现了这个问题。Amazon将其默认负载均衡器设置更改为不启用DES-CBC3-SHA密码。如果要允许较旧的XP TLS 1.0与ELB for HTTPS配合使用,则必须在Amazon ELB上启用该功能,否则会出现此错误。可以在ELB上更改密码,方法是转到控制台的“侦听器”选项卡,然后单击您要进行工作的特定侦听器旁边的密码。


2

如果您的WCF服务使用的是.net Framework 4.0,并且有人在服务器上禁用了TLS 1.0,则您将看到此异常。由于.net 4.0不支持更高版本的TLS。

支持的协议:https : //msdn.microsoft.com/zh-cn/library/system.security.authentication.sslprotocols(v=vs.100).aspx


4
实际上,有一个解决方法,您仍然可以使用: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2它可以在NET 4.0上运行。
F34R

@ F34R,您的评论解决了.NET 4.0应用程序的问题,该应用程序试图向最近从http转换为https的端点发出SOAP请求。受blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support的
Wesley Musgrove

1

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

复杂数据类型


我们调查了数据类型问题-我们只发送了dataContract中定义的普通的.NET对象-没有枚举或类似的东西。但是,我们安装了本文中提到的一些调试跟踪工具,并且可以看到我们有2个正常工作的调用,但是对于第三个“非正常工作”的调用却什么也没有出现。这向我表明,它甚至根本没有脱离客户端计算机。
山姆·舒特

4
@SamSchutte:这个错误曾经解决过吗?您能否提供解决方案?
VoodooChild


1

由于几周一切正常,然后停止了运行,因此我怀疑这与您的代码无关。可能是在IIS / ASP.NET中激活服务时发生错误,而不是在调用代码时发生。运行时可能只是检查网站的配置,并抛出与服务无关的一般错误消息。

我怀疑证书已过期或绑定设置不正确。如果该网站的HTTPS配置错误,则无论您的代码是否使用它们,都可能会出现此错误。


1

尝试在浏览器中和Https模式下浏览该服务,如果该服务不是可浏览的,则证明出现此错误的原因。现在,要解决此错误,您需要检查:

  • https端口,检查其他资源(网站)是否未使用它
  • 检查https的证书是否已正确配置(检查签名权限,自签名证书,使用多个证书)
  • 检查WCF服务绑定和Https模式的配置

1

我们的问题只是端点上的端口号错误地设置为8080。将其更改为8443即可正常工作。


1

而不是显式设置安全协议,更好的方法是设置web.config <compilation targetFramework =“ 4.5”>或更高版本。


1

我通过将.NetFramework版本从4.5.2升级到4.7.2解决了我的问题。


0

刚刚经历过:

System.ServiceModel.CommunicationException:

http://example.com/WebServices/SomeService.svc发出HTTP请求时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配引起的。

---> System.Net.WebException:基础连接已关闭:发送时发生意外错误。

---> System.IO.IOException:无法将数据写入传输连接:远程主机强行关闭了现有连接。

我从管理员那里得知托管Web服务的IIS应用程序池在内存不足后会自动回收。当应用程序池回收时,在客户端上发生错误。

增加应用程序池可用的内存可以解决当前的问题。


0

最近,我们通过网络设备(F5)操作系统更新迫使我们的应用程序从SSL转换为TLS。我们通过重新生成自签名证书来解决此错误。希望这能在以后帮助某人解决问题,因为我们在解决方案之前花费了很多维护时间进行故障排除。


0

刚刚经历过:

System.ServiceModel.CommunicationException:

http://example.com/WebServices/SomeService.svc发出HTTP请求时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配引起的。

---> System.Net.WebException:基础连接已关闭:发送时发生意外错误。

---> System.IO.IOException:无法将数据写入传输连接:远程主机强行关闭了现有连接。

我们的bluecoat代理许可证已过期!因此无法联系外部方(互联网)。


0

我们遇到了同样的问题,就我们而言,通过重新安装证书并再次创建绑定来解决。导致我们出现的事实是,即使在网站上获得一个简单的png图像文件也会产生相同的错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.