Прерывание потока при выполнении запроса HTTP Get

Недавно я начал получать предупреждения со следующей трассировкой стека:

Сообщение: Тема была прервана.

Трассировка стека: в System.Net.Connection.CompleteStartConnection (логический асинхронный, HttpWebRequest httpWebRequest) в System.Net.Connection.CompleteStartRequest (логический onSubmitThread, запрос HttpWebRequest, TriState needReConnect) в System.Net.Connection.SubmitRequest (запрос HttpWebRequest, логический принудительный ) в System.Net.ServicePoint.SubmitRequest(запрос HttpWebRequest, String connName) в System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint) в System.Net.HttpWebRequest.GetResponse() в удалено для защиты личности

Мне кажется, что поток прерывается до того, как будет установлено фактическое соединение с удаленным сервером. Это правда? Почему может возникнуть такая ситуация - попытка сузить проблему.

Я попытался найти документацию по методу 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, вызывается задачей, которая находится на таймере.


person Arxo Clay    schedule 27.04.2015    source источник
comment
Как выглядит (соответствующий) фрагмент кода, который вызывает это исключение?   -  person stakx - no longer contributing    schedule 27.04.2015
comment
Извинения! Мне удалось нажать «опубликовать», прежде чем я закончил печатать содержимое. Я заполнил содержание вопроса сейчас.   -  person Arxo Clay    schedule 27.04.2015
comment
Во-вторых, в каком проекте/контексте вы выполняете этот код? АСП.НЕТ? Консольное приложение? Приложение WPF или Windows Forms?   -  person stakx - no longer contributing    schedule 27.04.2015
comment
Вызывающий код является частью службы ASMX (SOAP). Это метод, который использует клиент службы для выполнения вызова HTTP GET. Служба SOAP вызывается по расписанию и, в свою очередь, выполняет вызов HTTP GET.   -  person Arxo Clay    schedule 27.04.2015
comment
@ArxoClay Я думаю, они хотят видеть реальный код, а не описание его :)   -  person Steve's a D    schedule 27.04.2015
comment
Подобные вещи происходят, когда вызов службы завершается, а асинхронная операция все еще выполняется. Помните о таких вещах, как: hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx   -  person Moby Disk    schedule 28.04.2015
comment
Пожалуйста, покажите код, который вызывает код, который вы разместили. Проблема заключается в способе запуска этого блока кода, а не в самом коде.   -  person Scott Chamberlain    schedule 28.04.2015
comment
@ScottChamberlain: Можно мне немного больше контекста, чтобы лучше ответить на этот вопрос? Как вы думаете, способ создания запроса может быть проблематичным?   -  person Arxo Clay    schedule 28.04.2015
comment
Я бы поставил деньги, код, который вы разместили, запускается внутри Task или Thread. Ваша страница ASMX завершает свой ответ до завершения этой задачи или потока. IIS закрывает AppDomain, в котором выполнялся ваш код (включая ваш фоновый процесс, который еще не завершен), вы получаете полученную ошибку. Это все догадки, потому что вы не показали свой код, поэтому я не опубликовал ответ. Пожалуйста, прочтите сообщение ссылка на Moby Disk. идет более подробно   -  person Scott Chamberlain    schedule 28.04.2015
comment
@ScottChamberlain: Вы правы в том, что код, который я написал, вызывается задачей по таймеру. Интересно то, что IdleTimeout был установлен на 0, чтобы IIS не тянул ковер в домене приложения. Но, основываясь на статье, на которую ссылались вы и Moby Disk, кажется, что IIS делает это по множеству причин (не только по тайм-аутам), правильно?   -  person Arxo Clay    schedule 28.04.2015
comment
@ArxoClay Да, тайм-аут — это только одна из многих причин, по которым пул приложений может быть перезапущен.   -  person Scott Chamberlain    schedule 28.04.2015
comment
Это может быть вызвано Response.Redirect. MSDN   -  person Reg Edit    schedule 28.04.2015


Ответы (2)


Я сталкивался с этой проблемой раньше, и обычно это указывает на то, что либо код вызова службы через ваш клиент, либо сама служба вызывает Thread.Abort() (что является плохой практикой, но используется для смягчения того факта, что соединения могут оставаться зависшими). открыть на сервере). ThreadAbortExceptions вызовы службы в основном происходят, когда потоку явно приказано прерваться.

Я должен добавить, что если сервер прерывает поток, вы обычно возвращаете его как SoapException. Поэтому проверьте свою кодовую базу на предмет использования Thread.Abort().

person moarboilerplate    schedule 27.04.2015
comment
Он использует ASP.NET, который прерывает все потоки при закрытии службы. - person Scott Chamberlain; 27.04.2015
comment
@ScottChamberlain, но он не размещает службу? - person moarboilerplate; 27.04.2015
comment
Да, см. этот комментарий код запускается внутри экземпляра IIS ASMX. IIS вызывает Abort. - person Scott Chamberlain; 28.04.2015

Большое спасибо @Moby Disk и @Scott Chamberlain за помощь в решении этой проблемы.

Эта проблема возникла из-за того, что в пуле приложений, в котором размещен написанный мной код, для параметра Повторное использование задано значение Обычный временной интервал (минуты) 1740 минут, что соответствует 29 часам (по умолчанию).

Всякий раз, когда рабочий поток выполнялся во время такого перезапуска, я видел ошибку (потому что он получал исключение ThreadAbort, которое он не обрабатывал). Исправление настройки решило проблему.

person Arxo Clay    schedule 28.04.2015