C# ServicePoint安全检查以防止阻塞新的HttpWebRequests

C# ServicePoint安全检查以防止阻塞新的HttpWebRequests,c#,.net,httpwebrequest,servicepoint,C#,.net,Httpwebrequest,Servicepoint,我正在使用一个第三方库,它可以进行许多http调用。通过反编译代码,我确定它正在创建和使用原始的HttpWebRequest,所有这些都指向一个URL。问题是有些请求没有正确关闭。一段时间后,当库对所有新的HttpWebRequest调用GetRequestStream()*时,它们将永远被阻塞。我已确定此阻塞是由于该特定主机的ServicePoint上的ConnectionLimit造成的,其默认值为2。换句话说,该库已打开2个请求,然后尝试打开第3个请求,这将阻止 我想防止这种阻塞。该库具有

我正在使用一个第三方库,它可以进行许多http调用。通过反编译代码,我确定它正在创建和使用原始的
HttpWebRequest
,所有这些都指向一个URL。问题是有些请求没有正确关闭。一段时间后,当库对所有新的
HttpWebRequest
调用GetRequestStream()*时,它们将永远被阻塞。我已确定此阻塞是由于该特定主机的ServicePoint上的ConnectionLimit造成的,其默认值为2。换句话说,该库已打开2个请求,然后尝试打开第3个请求,这将阻止

我想防止这种阻塞。该库具有相当强的弹性,可以重新连接自身,因此,如果我终止它已建立的现有连接,也没关系。问题是我无法访问此库生成的任何
HttpWebRequest
HttpWebResponse
s。但是我知道它访问的URL,因此我可以访问它的
ServicePoint

var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));

(注意:在这些HttpWebRequests上启用了KeepAlive)

这是有效的,但我不确定这是解决问题的最佳方法

  • 获取url的服务点对象
    var sp=ServicePointManager.FindServicePoint(新Urihttp://UrlThatIKnowAbout.com"));
  • ConnectionLimit
    增加到
    int.MaxValue
  • 创建一个后台线程,定期检查服务点上的
    ConnectionCount
    。如果超过5,则调用
    CloseConnectionGroup()
  • MaxIdleTime
    设置为1小时(而不是默认值)

  • 设置
    连接限制应该可以防止阻塞。监视器线程将确保不会有太多的连接同时处于活动状态。设置
    MaxIdleTime
    应该是一种退路。

    这是可行的,尽管我不确定这是解决问题的最佳方法

  • 获取url的服务点对象
    var sp=ServicePointManager.FindServicePoint(新Urihttp://UrlThatIKnowAbout.com"));
  • ConnectionLimit
    增加到
    int.MaxValue
  • 创建一个后台线程,定期检查服务点上的
    ConnectionCount
    。如果超过5,则调用
    CloseConnectionGroup()
  • MaxIdleTime
    设置为1小时(而不是默认值)

  • 设置
    连接限制应该可以防止阻塞。监视器线程将确保不会有太多的连接同时处于活动状态。设置
    MaxIdleTime
    应该是一种退路。

    如果您解决了问题,请为将来可能遇到类似情况的其他人写一篇关于您所采取步骤的有用说明。谢谢你。@jonathan我做了一个有根据的猜测,并在我的问题中提出了三个步骤作为解决方案,最后它成功了。有什么困惑吗?你的答案无法自圆其说。你说“我做了这个,它成功了。”读者不禁想知道“这个”和“它”指的是什么,删除前留下的评论就是明证。请随意写出一个能够独立回答的答案。谢谢。@Dan,我对TCP连接是如何建立的也很感兴趣-但是当我在ilsphy中查看程序集时,我找不到参考?你运气好吗?如果是的话,你能给我一些建议吗?基本上,我试图理解与您相同的内容“我有兴趣了解GetRequestStream()与远程服务器建立TCP连接,而GetResponse()实际发送请求”-http webrequest如何创建TCP连接、管理它们?我想我对细节了解得稍微好一点,我想(有关详细信息):如果你解决了你的问题,请写一篇有用的解释,说明你所采取的步骤,以帮助将来可能遇到类似情况的其他人。谢谢你。@jonathan我做了一个有根据的猜测,并在我的问题中提出了三个步骤作为解决方案,最后它成功了。有什么困惑吗?你的答案无法自圆其说。你说“我做了这个,它成功了。”读者不禁想知道“这个”和“它”指的是什么,删除前留下的评论就是明证。请随意写出一个能够独立回答的答案。谢谢。@Dan,我对TCP连接是如何建立的也很感兴趣-但是当我在ilsphy中查看程序集时,我找不到参考?你运气好吗?如果是的话,你能给我一些建议吗?基本上,我正在尝试理解与您相同的内容“我有兴趣了解GetRequestStream()与远程服务器建立TCP连接,而GetResponse()实际发送请求”-http webrequest如何创建TCP连接、管理它们?我想我对细节了解得稍微好一点,我想(有关细节):