.. Основное соединение было закрыто: произошла непредвиденная ошибка при получении

У меня есть следующий код:

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();