2016-06-02 7 views
2

У меня есть очень простой сервис, который вызывает URL-адрес и фиксирует статус, который выписывается этой службой;Подключенное соединение было закрыто: произошла непредвиденная ошибка

// Service call used to determine availability 
System.Net.WebClient client = new System.Net.WebClient(); 

// I need this one (sorry, cannot disclose the actual URL) 
Console.WriteLine(client.DownloadString(myServiceURL + ";ping")); 

// I added this for test purposes 
Console.WriteLine(client.DownloadString("https://www.google.com")); 

«DownloadString» для myServiceURL линии бросает ошибку «Базовое соединение закрыто: Непредвиденная ошибка», и нет ничего показывать в Скрипаче для этой линии, в то время как «DownloadString» для google.com работ и Для этого я вижу консольный вывод.

Следуя другим рекомендациям по ошибке, я попытался сочетать настройки UseDefaultCredentials, опции кодирования, добавляя соответствующие заголовки в запрос, ни один из которых не имеет никакого значения.

client.UseDefaultCredentials = true; 
client.Encoding = Encoding.UTF8; 

Когда я перехожу к myServiceURL в браузере, он работает и показывает «ОК», как и ожидалось.

Другой метод из тех же служб были закодирован следующим образом:

// Request 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(myServiceURL + ";login"); 

// Set the request configuration options 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
req.ContentLength = bytes.Length; 
req.Timeout = -1; 

// Call for the request stream 
using (Stream os = req.GetRequestStream()) 
{ 
    os.Write(bytes, 0, bytes.Length); 
} 

// ....snip 

// This line fails with the same error as before 
WebResponse resp = req.GetResponse() 

Это все время работает на Windows 7 (64-битные) ПК с использованием .NET Framework 4.0; служба myServiceURL - это сторонний сервис, для которого я не контролирую.

+0

Вы пробовали req.Proxy = WebProxy.GetDefaultProxy(); –

+0

Только что попробовали использовать GetDefaultProxy (который устарел?), И это не имело никакого значения. – Sean

+0

oo жаль, что, скорее, скорее, чем contentype, вы можете использовать этот req как HttpWebRequest.Accept = "text/xml"; –

ответ

0
 //assuming this is set 
     byte[] Data; 
     string url = string.Format("{0};{1}" ,myServiceURL, "login"); 
     // Request 
     HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(url); 

     wreq.Method = "POST"; 
     wreq.Proxy = WebProxy.GetDefaultProxy(); 

     (wreq as HttpWebRequest).Accept = "text/xml"; 


     if (Data != null && Data.Length > 0) 
     { 
      wreq.ContentType = "application/x-www-form-urlencoded"; 
      System.IO.Stream request = wreq.GetRequestStream(); 
      request.Write(Data, 0, Data.Length); 
      request.Close(); 
     } 
     WebResponse wrsp = wreq.GetResponse(); 
+0

Я не совсем уверен, что существенно отличается от этого кода, по сравнению с кодом, который я использовал; но я пробовал эту ... ту же ошибку, и я действительно подозреваю, что что-то происходит в стороне от кода, так как те же запросы на google.com и простой текстовый файл (загруженные на мой собственный сервер) работали так, как я бы ожидается. Расследования продолжаются – Sean

+0

Я понимаю, просто попробуйте. Изменение в contentType "" application/x-www-form-urlencoded "" взгляните на это сообщение http://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart- форма-данные –

5

Наконец-то дошли до конца, и ответ может не распространяться на всех с одинаковой проблемой; Я бы предположил, что ключ был в том, что мы могли извлекать информацию с какого-то сайта HTTPS, но не всех и отслеживать события с помощью комбинации Fiddler, WireShark и нашего брандмауэра.

Открытие сайтов в Google Chrome и нажатие на замок на https в URL-адресе для сайта, чтобы просмотреть «Обзор безопасности», мы видим, что для большинства сайтов, которые мы пробовали, есть записи, перечисленные для ' Действительный сертификат »и« Защищенные ресурсы », но на этом сайте также была запись« Безопасное соединение TLS », а WireShark подтвердил, что квитирование (из Chrome) использовало TLS v1.2

TLS v1.2 поддерживается только .NET Framework 4.5 (или выше), поэтому для этого требуется Visual Studio 2012 (или выше)

В настоящее время мы работаем с .NET Framework 4.0 с Visual Studio 2010

Загрузили Visual Studio 2015 Community Edition, чтобы протестировать «тот же» код в рамках проекта с использованием .NET Framework 4.5.2, и он сразу сработал.