Я боролся с этой проблемой уже более 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 - не работает
Если у кого-то есть понимание или любая другая отладка / сбор информации, которую я не пробовал, я был бы очень рад.