2016-11-15 2 views
0

Я унаследовал старый веб-сайт, на котором есть функция загрузки документа Excel из записей пользователя. Следующий код вызывает «Удаленный узел закрыл соединение код ошибки 0x800704CD..» Ошибка:Ошибка «Удаленный хост закрыл соединение» для HttpResponse.Write

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web; 

namespace MySite.ApplicationServices 
{ 
public class OutputFileWriter : IDisposable 
{ 
    private HttpResponse _response; 
    private bool _isResponsePrepared; 

    public OutputFileWriter(HttpResponse response) 
    { 
     this._response = response; 
    } 

    public OutputFileWriter(HttpResponse response, string outputFileName) 
     : this(response) 
    { 
     this.OutputFileName = outputFileName; 
    } 

    public string OutputFileName { get; set; } 

    public virtual void WriteLine(string line) 
    { 
     if (this._response == null) 
      throw new ObjectDisposedException("OutputFileWriter"); 

     if (!this._isResponsePrepared) 
     { 
      this.PrepareResponse(); 
      this._isResponsePrepared = true; 
     } 

     this._response.Write(line); 
    } 

    public virtual void Dispose() 
    { 
     if (this._response != null) 
     { 
      this._response.Flush(); 
      this._response.Close(); 
      this._response = null; 
     } 
    } 

    protected virtual void PrepareResponse() 
    { 
     if (string.IsNullOrEmpty(this.OutputFileName)) 
      throw new InvalidOperationException("An output file name is required."); 

     this._response.Clear(); 
     this._response.ContentType = "application/octet-stream"; 
     this._response.Buffer = this._response.BufferOutput = false; 
     this._response.AppendHeader("Cache-Control", "no-store, no-cache"); 
     this._response.AppendHeader("Expires", "-1"); 
     this._response.AppendHeader("Content-disposition", "attachment; filename=" + this.OutputFileName); 
    } 
} 
} 

Вот пример кода, который вызывает его (по нажатию на кнопку «Загрузить»):

using (OutputFileWriter writer = new OutputFileWriter(this.Response, "users.xls")) 
      { 
       foreach (string result in searchResults) 
       { 
        writer.WriteLine(result); 
       } 
      } 

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

В случае, если это релевантно, сайт настроен в IIS 7 с интегрированным пулом приложений в .NET 2.0. Он также сбалансирован по нагрузке.

Любые мысли?

+0

Можете ли вы дать [этот ответ о правильном использовании интерфейса IDisposable] (http://stackoverflow.com/a/538238/215552) читать. Я не говорю, что вы делаете это неправильно, но всегда рекомендуется дважды проверять, когда вы имеете дело с 'IDisposable'. –

+0

@MikeMcCaughan Что странно, так это то, что он отлично работает локально в Visual Studio. Возможно, возможно, указывает на настройки IIS или App pool. – user806982

ответ

0

После некоторого дальнейшего исследования кажется, что файл действительно можно загрузить только в Firefox.

Следующее сообщение предлагается изменить с _response.Close() на _response.End() может работать https://productforums.google.com/forum/#!topic/chrome/8Aykgxa8kWU, что и было.

Однако, я тогда увидел этот HttpResponse.End vs HttpResponse.Close vs HttpResponse.SuppressContent

Так что я теперь называет CompleteRequest() на экземпляре HttpApplication. Как это:

Старый метод

public virtual void Dispose() 
{ 
    if (this._response != null) 
    { 
     this._response.Flush(); 
     this._response.Close(); 
     this._response = null; 
    } 
} 

Новый метод:

public virtual void Dispose() 
{ 
    if (this._response != null) 
    { 
     this._response.Flush(); 
     this._application.CompleteRequest(); 
     this._response = null; 
    } 
} 

Это теперь работает нормально.

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