WebClient.DownloadString () + REST + HTTPS + Win2003 = зависший поток - PullRequest
2 голосов
/ 01 марта 2011

Я боролся с этой проблемой уже более 2 недель и ничего не получил.

Первая среда: Windows 2003 R2 SP2 / SharePoint 2007 SP1 / .NET 3.5.

По сути, мы делаем вызовы веб-службы для сбора данных из удаленного API. API имеет несколько конечных точек для REST и несколько для SOAP. Конечные точки - это конечные точки HTTPS с дайджест-проверкой подлинности. Когда мы совершаем вызовы с конечными точками SOAP, кажется, что все работает нормально. Но затем мы пытаемся сделать вызов, используя REST, и поток зависает, а затем умирает ужасной смертью, когда IIS решает, что поток больше не отвечает, и убивает его. Сначала мы думали, что это проблема SSL (и она все еще может быть), потому что мы не видим никаких проблем при использовании конечных точек HTTP (маршрут к тому же API просто не SSL).

Ниже приведен код, который мы используем для вызова REST:

private void Process(HttpContext context, String url, String restParam)
{
    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(validateCertificate);

    WriteLogMessage("Start Process");
    String pattern = "{0}{1}";
    String address = String.Format(pattern, url, restParam);

    WriteLogMessage("ADDRESS is" + address);
    LSWebClient client = new LSWebClient();
    client.Timeout = 600000;

    WriteLogMessage("TIMEOUT (client.Timeout) is " + client.Timeout.ToString());
    client.Credentials = new NetworkCredential(XYZConfigurationSettings.APIUserName, XYZConfigurationSettings.APIPassword);

    try {
        String result = client.DownloadString(address);
        WriteLogMessage("End Process. RESULT length is " + (result != null ? result.Length : 0));
        context.Response.Write(result);
    } 
    catch (Exception ex) 
    {
        WriteLogMessage("EXCEPTION!!! Message----" + ex.Message + "---- StackTrace ----" + ex.StackTrace + "");
    }
}

private bool validateCertificate(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
    WriteLogMessage("bypassAllCertificateStuff");
    return true;
}

Итак, оставив в стороне дерьмовый код, мы добавили несколько вещей, чтобы попытаться обойти то, что мы считали проблемой SSL-сертификата. (установка тайм-аута запроса на 10 минут, использование пользовательской проверки сертификата и т. д.) Однако, похоже, что ничего из этого не решает проблему.

Вот результат нашей регистрации:

2/28/2011 3:35:28 PM: Start
2/28/2011 3:35:28 PM: Start Process
2/28/2011 3:35:28 PM: ADDRESS ishttps://<host>/ws/rs/v1/taxonomy/TA/root/
2/28/2011 3:35:28 PM: TIMEOUT (client.Timeout) is 600000
2/28/2011 3:35:50 PM: CheckValidationResult
2/28/2011 3:35:50 PM: bypassAllCertificateStuff
2/28/2011 3:41:51 PM: EXCEPTION!!! Message ----Thread was being aborted.---- StackTrace ----   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)
   at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
   at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)
   at XYZ.DAO.Handlers.RestServiceHandler.Process(HttpContext context, String url, String restParam)
   at XYZ.DAO.Handlers.RestServiceHandler.ProcessRequest(HttpContext context)----

Я пытался использовать свой браузер для просмотра возвращаемых данных, но браузер IE6, который не поддерживает SSL. Однако я вижу (в прокси-сервере Fiddler / Charles), что он пытается выполнить запрос и получает ошибку 401, но, поскольку я не вижу серверный трафик с помощью этих программ, я не могу точно сказать, на каком этапе происходит ошибка. 1015 *

Что еще хуже, я не могу воспроизвести эту проблему на любом другом сервере, который у меня есть (примечание: все они являются серверами Windows 2008).

Итак, в итоге вот что я нашел:

МЫЛО - работа
ОТДЫХ - без работы

Win2008 - работа
Win2003 - нет работы

HTTP - работа
HTTPS - не работает

Если у кого-то есть понимание или любая другая отладка / сбор информации, которую я не пробовал, я был бы очень рад.

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

Вы сможете получить больше информации о трассировке, если добавите в свой клиентский файл .config следующее:

<system.diagnostics>
    <sources>
        <source name="System.Net" switchValue="Information, ActivityTracing">
            <listeners>
                <add name="System.Net"
                     type="System.Diagnostics.TextWriterTraceListener"
                     initializeData="System.Net.trace.log" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>
0 голосов
/ 07 апреля 2011

Я обнаружил, что вызывало зависание вызова веб-службы - проблема заключалась в том, что служба, которую мы вызывали, использовала защиту от повторной атаки и безопасность дайджеста:

  1. Наш сервер отправлял быначальный запрос без заголовка безопасности
  2. На запрос был получен стандартный вызов 401, предоставляющий одноразовый номер для использования.(Срок действия одноразового номера истекает через 10 секунд после вызова)
  3. Наш сервер потратил 30 секунд, чтобы сгенерировать второй ответ, используя этот одноразовый номер
  4. Таким образом, удаленный сервер затем найдет просроченный одноразовый номер и снова выдастеще один вызов 401.

Цикл будет продолжаться, пока поток локального сервера не будет прерван.Однако почему наш локальный сервер берет 30 $ @ #%!секунд для создания заголовка безопасности мне не хватает.Я проверил журналы, которые были предоставлены посредством диагностики выше, но ничего из этого не помогло.Я собираюсь записать это на сервер, перегруженный и не имеющий достаточно памяти, чтобы обработать выход из мокрого бумажного пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...