Передача больших файлов IIS 7.0: «Невозможно прочитать данные из транспортного соединения: соединение было закрыто». - PullRequest
1 голос
/ 10 октября 2010

Предположим, у вас есть страница ASP.NET с этими строками кода:

while (true)
{
   byte[BUFFER_SIZE] buffer;
   // Fill buffer with pseudo data
   Response.OutputStream.Write(buffer, 0, buffer.Length);
   Response.Flush();
}

У вас также есть тестовое приложение для вышеуказанной страницы с этими строками кода:

while (readBytes != 0)
{
   byte[BUFFER_SIZE] buffer;
   readBytes = stream.Read(buffer, 0, buffer.length)
}

Вместо того, чтобы читать настоящий огромный файл, я пытался на лету генерировать случайные двоичные данные и передавать их клиенту, и все работало нормально.Затем я написал клиента, который просто читает байты со страницы ASP.NET, а затем ничего не делает с ним и просто читает следующие байты, пока соединение не закрывается страницей ASP.NET (загрузка завершена).Я использовал временную настройку на странице ASP.NET для того, когда заканчивать загрузку (это стресс-тест).

Итак, что IIS 7.0 и ASP.NET делают для потоковой передачи данных в течение определенного периода времени(т.е. один час).На этой странице я запустил 100 одновременных клиентов со средней скоростью загрузки 250 КБ / с в течение одного часа.Все было в порядке в течение примерно 45 минут, но внезапно IIS закрывает все соединения с этим кодом ошибки на стороне клиента:

Невозможно прочитать данные из транспортного соединения: соединение было закрыто.

Я предполагаю, что речь идет о передаче большого количества двоичных данных через IIS, и в IIS 7.0 должна быть какая-то конфигурация, которая запускается моим стресс-тестом, но какая конфигурация.

1 Ответ

1 голос
/ 10 октября 2010

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

После того, как я столкнулся с проблемой, я искал в Интернете и обнаружил, что на подобные вопросы никогда не было ответа. По моему опыту, когда вы задаете вопрос, который еще никто не задавал, или когда есть много похожих вопросов без возможности получить ответ, что-то не так с этим вопросом, но я не думал об этом в тот момент. После отключения я изменил параметры стресс-теста и выяснил, что клиенты отключаются в конце времени теста (как я уже говорил, тест был разработан на основе времени). Ужасно где-то в моем коде я делал что-то не так, где-то закрывая запрос. Несмотря на то, что везде в .NET вы должны закрывать соединения, освобождать ресурсы и вызывать распоряжение объектами здесь, в ASP.NET, вы не должны вызывать этот метод вообще:

Response.Close()

После того, как вы закончили на странице ASP.NET, вам просто нужно позволить IIS сделать все остальное (пусть путь выполнения покинет ваш код). Я считаю, что-то не так в этом. Возможно, он не должен быть публичным в области видимости страницы asp.net, или имя метода должно быть примерно таким: Response.Disconnect(), потому что оно очень похоже на очистку кода.

Да, я пинал себя, отключая клиентов с помощью Response.Close()

После удаления этого кода все в порядке, но когда свободной оперативной памяти компьютера недостаточно, я получаю эту ошибку, которая приветствуется, потому что вы можете преодолеть это, добавив немного ОЗУ:

An existing connection was forcibly closed by the remote host.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...