The underlying connection was closed: An unexpected error occurred on a send.

当试图发起一个http/https连接时,.Net抛出“The underlying connection was closed: An unexpected error occurred on a send.”,通过搜索我们能发现非常非常多导致该错误的原因,微软还特意整理了一篇kb http://support2.microsoft.com/default.aspx?scid=kb;EN-US;915599

当你试过kb中所有可能解决方案之后,如果还是不能解决问题。不妨确认一下您是否在发起https请求;如果是的话,有可能由于ServicePointManager.SecurityProtocol设置错误导致了该问题。

如果您要连接的服务器不支持SSL3,但是ServicePointManager.SecurityProtocol却被设置成了SecurityProtocolType.Ssl3,这就可能导致“The underlying connection was closed: An unexpected error occurred on a send.”。

由于ServicePointManager是一个静态类,也许您会发现您的代码并没有显式地设置SecurityProtocol,但是这并不代表SecurityProtocol没有被其它代码在其它地方被无意地设置为您要连接的服务器不支持的SecurityProtocol。

静态类的作用域是整个进程,所以有可能你的程序没有显式地设置ServicePointManager.SecurityProtocol,但是有可能你调用的库设置了SecurityProtocol,这也会影响你的程序的使用。当然你可以通过Application Domains来缩小静态类的作用域,具体参见 http://msdn.microsoft.com/en-us/library/ms173138(v=vs.100).aspx

ServicePointManager.SecurityProtocol属性的默认值是SecurityProtocolType.Tls|SecurityProtocolType.Ssl3,所以在大多数情况下,我们可以不用显式设置。但是归根结底,我觉得微软将ServicePointManager设置为一个静态类,而且该类的某些设置影响全局的连接,怎么看来都有点不妥。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>