.. Основное соединение было закрыто: произошла непредвиденная ошибка при получении
У меня есть следующий код:
private Uri currentUri;
private void Form1_Load(object sender, EventArgs e)
{
currentUri = new Uri(@"http://www.stackoverflow.com");
HttpWebRequest myRequest = (HttpWebRequest) HttpWebRequest.Create("http://www.stackoverflow.com");
WebProxy myProxy = new WebProxy("120.198.230.8:81");
myRequest.Proxy = myProxy;
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
webBrowser1.DocumentStream = myResponse.GetResponseStream();
webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
}
void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (e.Url.AbsolutePath != "blank")
{
currentUri = new Uri(currentUri, e.Url.AbsolutePath);
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(currentUri);
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
webBrowser1.DocumentStream = myResponse.GetResponseStream();
e.Cancel = true;
}
}
после компиляции:
error: необработанное исключение типа "System.Net.WebException" произошел в System.dll
Дополнительная информация: Основное соединение было закрыто: произошла непредвиденная ошибка при приеме.
в строке HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
Пожалуйста, помогите мне
Ответы
Ответ 1
Подключенное соединение было закрыто: произошла непредвиденная ошибка при получении.
Эта проблема возникает, когда сервер или другое сетевое устройство неожиданно закрывает существующий протокол управления передачей (TCP) подключение. Эта проблема может возникнуть, когда значение тайм-аута на сервер или сетевое устройство установлено слишком низко. Чтобы решить эту проблему проблема, см. резолюции A, D, E, F и О. Проблема также может возникают, если сервер неожиданно сбрасывает соединение, например, если необработанное исключение приводит к сбою процесса сервера. Анализ сервера журналы, чтобы узнать, может ли это быть проблемой.
Разрешение
Чтобы устранить эту проблему, убедитесь, что вы используете самую последнюю версию .NET Framework.
Добавьте метод в класс, чтобы переопределить метод GetWebRequest
. Это изменение позволяет получить доступ к объекту HttpWebRequest. Если вы используете Microsoft Visual С#, новый метод должен быть похож на следующий.
class MyTestService:TestService.TestService
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest webRequest = (HttpWebRequest) base.GetWebRequest(uri);
//Setting KeepAlive to false
webRequest.KeepAlive = false;
return webRequest;
}
}
Выдержка из KB915599: вы получаете одно или несколько сообщений об ошибках при попытке сделать HTTP-запрос в приложении, основанном на службе .NET Framework 1.1 Пакет 1.
Ответ 2
Установка HttpWebRequest.KeepAlive
на false
не сработала для меня.
Поскольку я обращался к странице HTTPS, мне пришлось установить протокол безопасности точки обслуживания на Tls12.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Обратите внимание, что есть и другие SecurityProtocolTypes
: SecurityProtocolType.Ssl3
, SecurityProtocolType.Tls
, SecurityProtocolType.Tls11
Поэтому, если Tls12 не работает для вас, попробуйте три оставшихся варианта.
Также обратите внимание, что вы можете установить несколько протоколов. Это предпочтительнее в большинстве случаев.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
Ответ 3
Ни один из решений там не работал у меня. В итоге я обнаружил следующую комбинацию:
- Клиентская система: Windows XP Pro SP3
- В клиентской системе установлена .NET Framework 2 SP1, 3, 3.5
- Программный таргетинг .NET 2 с использованием классических веб-сервисов (.asmx)
- Сервер: IIS6
- Веб-сайт "Безопасная связь" установлен на:
- Требовать Secure Channel
- Принять клиентские сертификаты
![введите описание изображения здесь]()
По-видимому, именно этот последний вопрос вызывал эту проблему. Я обнаружил это, пытаясь открыть URL веб-службы непосредственно в Internet Explorer. Он просто висел бесконечно, пытаясь загрузить страницу. Отключение "Принять клиентские сертификаты" позволило загружать страницу в обычном режиме. Я не уверен, что это была проблема с этой конкретной системой (возможно, с глюкометным сертификатом клиента?) Поскольку я не использовал сертификаты клиентов, этот параметр работал у меня.
Ответ 4
- .NET 4.6 и выше. Вам не нужно выполнять какую-либо дополнительную работу для поддержки TLS 1.2, она поддерживается по умолчанию.
.NET 4.5. TLS 1.2 поддерживается, но не является протоколом по умолчанию. Вы должны зарегистрироваться, чтобы использовать его. Следующий код сделает TLS 1.2 по умолчанию, обязательно выполните его перед установлением соединения с защищенным ресурсом:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
.NET 4.0. TLS 1.2 не поддерживается, но если в вашей системе установлен .NET 4.5 (или выше), вы все равно можете выбрать TLS 1.2, даже если ваша прикладная среда не поддерживает его. Единственная проблема заключается в том, что SecurityProtocolType в .NET 4.0 не имеет записи для TLS1.2, поэтому мы должны использовать числовое представление этого значения перечисления:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
.NET 3.5 или ниже. TLS 1.2 не поддерживается. Обновите ваше приложение до более новой версии фреймворка.
Ответ 5
Перед выполнением запроса я поставил оператор, как показано ниже, и он разрешил мою ошибку.
Просто к вашему сведению, если это кому-нибудь поможет.
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072; ctx.ExecuteQuery();