2014-02-12 3 views
10

У меня есть следующий код:..следующие Базовое соединение закрыто: Непредвиденная ошибка приема

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: An unhandled exception of type 'System.Net.WebException' occurred in System.dll

Additional information: The underlying connection was closed: An unexpected error occurred on a receive.

на линии HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

, пожалуйста, помогите me

+3

Google - ваш друг. [См. Сообщение об ошибке 3] (http://support.microsoft.com/kb/915599). – DGibbs

+1

@DGibbs Google привел меня сюда. – caiosm1005

ответ

12

Подходящее соединение было cl osed: произошла непредвиденная ошибка при получении.

This problem occurs when the server or another network device unexpectedly closes an existing Transmission Control Protocol (TCP) connection. This problem may occur when a time-out value on the server or on the network device is set too low. To resolve this problem, see resolutions A, D, E, F, and O. The problem can also occur if the server resets the connection unexpectedly, such as if an unhandled exception crashes the server process. Analyze the server logs to see if this may be the issue.

Разрешение

Чтобы устранить эту проблему, убедитесь, что вы используете самую последнюю версию .NET Framework.

Добавьте метод в класс, чтобы переопределить метод GetWebRequest. Это изменение позволяет получить доступ к объекту HttpWebRequest. Если вы используете Microsoft Visual C#, новый метод должен быть похож на следующий.

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: You receive one or more error messages when you try to make an HTTP request in an application that is built on the .NET Framework 1.1 Service Pack 1.

+0

Вы можете написать код конкретно? – Thomas

1

Ни один из решений там не работал для меня. То, что я в конце концов обнаружил, следующая комбинация:

  • система Клиент: Windows XP Pro SP3
  • система Клиент .NET Framework 2 SP1, 3, 3,5, установленные
  • Программное обеспечение таргетинга .NET 2 с использованием классических веб-сервисов (.asmx)
  • Сервер: IIS6
  • веб-сайт "Secure Communications" устанавливается:
    • Require Secure Channel
    • Принимать сертификаты клиента

enter image description here

Видимо, именно этот последний вариант, который вызывает проблему. Я обнаружил это, пытаясь открыть URL веб-службы непосредственно в Internet Explorer. Он просто висел бесконечно, пытаясь загрузить страницу. Отключение «Принять клиентские сертификаты» позволило загружать страницу в обычном режиме. Я не уверен, что это была проблема с этой конкретной системой (возможно, с глюкометным клиентом?) Поскольку я не пользовался клиентскими сертификатами, этот вариант работал для меня.

15

Установка 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

Хотя это было исправление для недавнего сценария, который мы имели с этой проблемой, нашей основной причиной было изменение на стороне сервера, которое отключило поддержку TLS 1.0. Таким образом, в зависимости от вашего сценария может быть несколько исправлений. –

+0

Приятно знать. У меня на самом деле была эта проблема при доступе к данным с стороннего сервера, поэтому я не имел никакого контроля над их поддержкой TLS. –

+2

Делает смысл. Ваш ответ получил один из наших людей по правильному пути, поэтому спасибо, что нашли время, чтобы написать его :) –

Смежные вопросы