Віддалений хост перервав з’єднання. Код помилки - 0x800704CD


81

Я отримую повідомлення електронної пошти про помилки зі свого веб-сайту, коли трапляється виняток. Я отримую цю помилку:

Віддалений хост перервав з’єднання. Код помилки - 0x800704CD

і не знаю чому. Я отримую близько 30 на день. Я також не можу відтворити помилку, тому не можу відстежити проблему.

Веб-сайт ASP.NET 2, який працює на IIS7.

Трасування стека:

в System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (результат Int32, Boolean throwOnDisconnect) в System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush () в System.Web.HttpResponse.Flush (Boolean finalFlush. attt. ) на System.Web.HttpResponse.End () на System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End () на System.Web.UI.PageRequestManager.OnPageError (відправник об’єкта, EventArgs e) .Web.UI.TemplateControl.OnError (EventArgs e) на System.Web.UI.Page.HandleError (виняток e) на System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint. Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) у System.Web.UI.Page.ProcessRequest () у System.Web. IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStep (крок IExecutionStep, логічний і виконаний синхронно)

Відповіді:


60

Я отримую цей постійно. Це означає, що користувач почав завантажувати файл, а потім він або не вдався , або він скасував його.

Щоб відтворити виняток, спробуйте зробити це самостійно - однак я не знаю жодних способів запобігти цьому (за винятком обробки лише цього конкретного винятку).

Вам потрібно вирішити, який найкращий шлях вперед залежить від вашого додатка.


Я не пропоную завантаження файлів на своєму сайті. Чи може це спричинити завантаження вмісту сторінки?
webnoob

7
Так, якщо дивитись на стек стека, це System.Web.HttpResponse.Flush()означає будь-яку відповідь. Я щойно знайшов це , це може допомогти вам дістатися до шляху проблеми, де viewstate дуже великий, а користувачі клацають занадто швидко, що може спричинити цей виняток.
m.edmondson,

Чи знаєте ви, чи це призводить до помилки для користувача чи просто до прихованої?
webnoob

2
Мої власні розслідування цього дослідження показують, що серед користувачів не бачиться нічого незвичайного. Чи були у вас скарги від клієнтів / клієнтів?
m.edmondson

2
Ні, ні. Дякую за допомогу.
webnoob

30

Як згадав m.edmondson , "віддалений хост закрив з'єднання". відбувається, коли користувач або браузер щось скасовує , або мережеве з’єднання падає і т. д. Однак це не обов’язково має бути завантаження файлу, а просто будь-який запит на будь-який ресурс, що призводить до відповіді клієнту. В основному помилка означає, що відповідь не може бути надіслана, оскільки сервер більше не може спілкуватися з клієнтом (браузером).

Існує ряд кроків, які ви можете зробити, щоб не допустити цього. Якщо ви вручаєте щось у відповіді за допомогою Response.Write, Response.Flush, повертаючи дані із веб-сервісу / методу сторінки чи чогось подібного, вам слід розглянути можливість перевірки Response.IsClientConnected перед надсиланням відповіді. Крім того, якщо відповідь може зайняти багато часу або потрібно багато обробки на стороні сервера, вам слід періодично перевіряти це, доки відповідь не закінчиться, якщо буде викликаний. Детальніше про цю нерухомість див. Нижче:

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

Крім того, що, на мою думку, найвірогідніше у вашому випадку, помилка спричинена чимось усередині фреймворку. Наступним посиланням може бути використане:

http://blog.whitesites.com/fixing-The-remote-host-closed-the-connection-The-error-code-is-0x80070057__633882307305519259_blog.htm

Наступний пост із переповненням стека також може зацікавити:

"Віддалений хост закрив підключення" у Response.OutputStream.Write


2
Великі злети для Response.IsClientConnected!
Stumblor

10

Можна відтворити помилку за допомогою коду нижче:

public ActionResult ClosingTheConnectionAction(){
   try
   {
      //we need to set buffer to false to
      //make sure data is written in chunks
      Response.Buffer = false;  
      var someText = "Some text here to make things happen ;-)";
      var content = GetBytes( someText );

      for(var i=0; i < 100; i++)
      {
         Response.OutputStream.Write(content, 0, content.Length);
      }

      return View();
   }
   catch(HttpException hex)
   {
      if (hex.Message.StartsWith("The remote host closed the connection. The error code is 0x800704CD."))
            {
                //react on remote host closed the connection exception.
                var msg = hex.Message;
            }  
   }
   catch(Exception somethingElseHappened)
   {
      //handle it with some other code
   }

   return View();
} 

Тепер запустіть веб-сайт у режимі налагодження. Помістіть точку зупинки в цикл, який записує у вихідний потік. Перейдіть до цього методу дії і після проходження першої ітерації закрийте вкладку браузера. Натисніть F10, щоб продовжити цикл. Після натискання на наступну ітерацію ви побачите виняток. Насолоджуйтесь своїм винятком :-)


2

Я отримував це на сайті asp.net 2.0 iis7 Windows2008. Той самий код на iis6 працював нормально. Це спричинило проблему для мене, оскільки це заплутало процес входу. Користувач входив би і отримував 302 до default.asxp, який проходив би через page_load, але не настільки, наскільки попередній візуалізація перед тим, як iis7 надішле 302 назад до login.aspx без cookie-файлу auth. Я почав грати з налаштуваннями пулу додатків, і чомусь, здається, "увімкнути 32-розрядні програми" це виправило. Не знаю, чому, оскільки цей сайт не робить нічого особливого, для чого потрібні 32-розрядні драйвери. У нас є деякі сайти, які все ще використовують Access, для яких потрібна 32-бітна версія, але не наші прямі SQL-сайти, подібні до цього.


увімкнення 32-розрядних додатків це виправило і для мене. Дякую !
Praneet Nadkar

Увімкнення 32-бітної програми може призвести до того, що програма буде використовувати менше пам'яті, що може натякати на наявність проблем із пам'яттю на сервері. Це також може бути зовсім іншою проблемою.
джаху

2

Я отримав цю помилку, коли динамічно читав дані з файлу WebRequestі ніколи не закривав файл Response.

    protected System.IO.Stream GetStream(string url)
    {
        try
        {
            System.IO.Stream stream = null;
            var request = System.Net.WebRequest.Create(url);
            var response = request.GetResponse();

            if (response != null) {
                stream = response.GetResponseStream();

                // I never closed the response thus resulting in the error
                response.Close(); 
            }
            response = null;
            request = null;

            return stream;
        }
        catch (Exception) { }
        return null;
    }

1

Я теж отримав ту саму помилку у своєму обробнику зображень, яку я писав. Я отримав це як 30 разів на день на місці з великим трафіком, вдалося його також відтворити. Ви отримуєте це, коли користувач скасовує запит (закриває сторінку або, наприклад, його підключення до Інтернету переривається), у моєму випадку в наступному рядку:

myContext.Response.OutputStream.Write(buffer, 0, bytesRead);

Я не можу придумати жодного способу запобігти цьому, але, можливо, ви можете правильно це впоратись. Приклад:

        try
        {
            …
            myContext.Response.OutputStream.Write(buffer, 0, bytesRead);
            …
        }catch (HttpException ex)
        {
            if (ex.Message.StartsWith("The remote host closed the connection."))
                ;//do nothing
            else
                //handle other errors
        }            
        catch (Exception e)
        {
            //handle other errors
        }
        finally
        {//close streams etc..
        }

4
Це не вдається, коли культура сервера не англійська (оскільки повідомлення буде іншою мовою). Просто використовуйте ErrorCodeвластивість виключення (яке має дорівнювати 2147943629, HRESULT 0x800704CD).
Рональд

4
Виправлення: ErrorCodeдля HRESULT 0x800704CD є -2147023667.
Рональд

Я ніколи не використовував неанглійську культуру серверів, але я бачу вашу проблему. Тим не менше, ви можете змінити цей рядок коду для обробки різних серверних культур, як та, яку ви запропонували
Роберт Бені
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.