发出 HTTP Get 请求时线程中止
Thread abort while making HTTP Get Request
最近我开始收到带有以下堆栈跟踪的警报:
Message: Thread was being aborted.
Stack Trace: at System.Net.Connection.CompleteStartConnection(Boolean
async, HttpWebRequest httpWebRequest) at
System.Net.Connection.CompleteStartRequest(Boolean onSubmitThread,
HttpWebRequest request, TriState needReConnect) at
System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean
forcedsubmit) at System.Net.ServicePoint.SubmitRequest(HttpWebRequest
request, String connName) at
System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint) at
System.Net.HttpWebRequest.GetResponse() at
removed to protect identity
在我看来,线程在与远程服务器建立实际连接之前就中止了。真的吗?为什么会出现这样的情况-试图缩小问题范围。
我尝试查找有关 System.Net.Connection.CompleteStartConnection
方法的文档,但找不到任何内容。有什么想法吗?
更新:添加调用代码的结构以响应评论。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = method; request.ContentType = "application/xml";
request.Headers.Add("Foo", "Bar");
request.Proxy = new System.Net.WebProxy(proxyAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
更新 2:此警报仅偶尔出现几分钟,然后消失。
更新 3:我尚未提供的重要信息 - 我在更新 1 中显示的代码片段正在被计时器上的任务调用。
我以前处理过这个问题,通常这表明通过您的客户端调用服务的代码或服务本身正在调用 Thread.Abort()
(这是不好的做法,但已被使用以减轻连接可能在服务器上保持打开状态的事实)。 ThreadAbortExceptions
服务调用主要发生在线程被明确告知要中止时。
我应该补充一点,如果服务器正在中止线程,您通常会以 SoapException
的形式取回它。因此,请检查您的代码库以了解 Thread.Abort()
.
的用法
非常感谢@Moby Disk 和@Scott Chamberlain 帮助我解决了这个问题。
这个问题是因为托管我编写的代码的应用程序池有一个回收设置常规时间间隔(分钟) 设置为 1740 分钟,相当于 29 小时(默认值)。
每当工作线程在这样的回收过程中处于 运行 时,我就会看到错误(因为它会收到一个它没有处理的 ThreadAbort 异常)。
修复设置解决了问题。
最近我开始收到带有以下堆栈跟踪的警报:
Message: Thread was being aborted.
Stack Trace: at System.Net.Connection.CompleteStartConnection(Boolean async, HttpWebRequest httpWebRequest) at System.Net.Connection.CompleteStartRequest(Boolean onSubmitThread, HttpWebRequest request, TriState needReConnect) at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit) at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName) at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint) at System.Net.HttpWebRequest.GetResponse() at removed to protect identity
在我看来,线程在与远程服务器建立实际连接之前就中止了。真的吗?为什么会出现这样的情况-试图缩小问题范围。
我尝试查找有关 System.Net.Connection.CompleteStartConnection
方法的文档,但找不到任何内容。有什么想法吗?
更新:添加调用代码的结构以响应评论。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = method; request.ContentType = "application/xml";
request.Headers.Add("Foo", "Bar");
request.Proxy = new System.Net.WebProxy(proxyAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
更新 2:此警报仅偶尔出现几分钟,然后消失。
更新 3:我尚未提供的重要信息 - 我在更新 1 中显示的代码片段正在被计时器上的任务调用。
我以前处理过这个问题,通常这表明通过您的客户端调用服务的代码或服务本身正在调用 Thread.Abort()
(这是不好的做法,但已被使用以减轻连接可能在服务器上保持打开状态的事实)。 ThreadAbortExceptions
服务调用主要发生在线程被明确告知要中止时。
我应该补充一点,如果服务器正在中止线程,您通常会以 SoapException
的形式取回它。因此,请检查您的代码库以了解 Thread.Abort()
.
非常感谢@Moby Disk 和@Scott Chamberlain 帮助我解决了这个问题。
这个问题是因为托管我编写的代码的应用程序池有一个回收设置常规时间间隔(分钟) 设置为 1740 分钟,相当于 29 小时(默认值)。
每当工作线程在这样的回收过程中处于 运行 时,我就会看到错误(因为它会收到一个它没有处理的 ThreadAbort 异常)。 修复设置解决了问题。