Я унаследовал старый веб-сайт, на котором есть функция загрузки документа 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. Он также сбалансирован по нагрузке.
Любые мысли?
Можете ли вы дать [этот ответ о правильном использовании интерфейса IDisposable] (http://stackoverflow.com/a/538238/215552) читать. Я не говорю, что вы делаете это неправильно, но всегда рекомендуется дважды проверять, когда вы имеете дело с 'IDisposable'. –
@MikeMcCaughan Что странно, так это то, что он отлично работает локально в Visual Studio. Возможно, возможно, указывает на настройки IIS или App pool. – user806982