IIS и Chrome: не удалось загрузить ресурс: net:: ERR_INCOMPLETE_CHUNKED_ENCODING
Недавно я столкнулся с проблемой Chrome, которая, я думаю, стоит поделиться ею с вами.
Я работал над самописцем API, используя HttpHandler, который должен возвращать данные json. Но когда возникает ошибка, я хотел отобразить html файл. Это очень хорошо работает в IE и FF, но не в Chrome.
В поисках инструментов разработчика была обнаружена эта ошибка: net:: ERR_INCOMPLETE_CHUNKED_ENCODING
Google сказал не очень много об этой проблеме, пока ее видели очень много. Все, что я узнал, было то, что через некоторое время оно исчезло волшебным образом.
Я выяснил, что он лежит на этих строках кода:
result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error
После удаления последней строки он работал хорошо. Я не знаю, почему только Chrome имел/имел проблему с этим, но казалось, что я закрыл поток ответов, прежде чем хром закончил читать его.
Я надеюсь, что это поможет тем, кто из вас сталкивается с тем же или подобным вопросом.
Теперь мой вопрос:
Как наилучшая оценка при закрытии/сбросе потока ответов? Существуют ли какие-либо правила?
Ответы
Ответ 1
В соответствии с ASP.NET устанавливает кодировку передачи как помеченную при преждевременном сбросе ответа:
ASP.NET передает данные клиенту в кодировке chunked (Transfer-Encoding: chunked), если вы преждевременно очищаете поток Response для запроса Http, а заголовок Content-Length для Response явно не задан вами.
Решение. Вам необходимо явно установить заголовок Content-Length для Response, чтобы предотвратить отключение ASP.NET ответа при очистке.
Здесь код С#, который я использовал для предотвращения ASP.NET от ответа на запрос, задав требуемый заголовок:
protected void writeJsonData (string s) {
HttpContext context=this.Context;
HttpResponse response=context.Response;
context.Response.ContentType = "text/json";
byte[] b = response.ContentEncoding.GetBytes(s);
response.AddHeader("Content-Length", b.Length.ToString());
response.BinaryWrite(b);
try
{
this.Context.Response.Flush();
this.Context.Response.Close();
}
catch (Exception) { }
}
Ответ 2
Я столкнулся с этой ошибкой при создании файла и нажал его на пользователя для загрузки, но только изредка. Когда это не получилось, файл был последовательно 2 байта. Close() принудительно закрывает соединение, закончилось или нет, и в моем случае это не так. Оставляя это, как было предложено в вопросе, подразумевалось, что в итоговый файл содержались как сгенерированный контент, так и HTML для всей страницы.
Решение здесь заменяло
context.Response.Flush();
context.Response.Close();
с
context.Response.End();
который делает то же самое, но не сокращает транзакцию.
Ответ 3
В моем случае проблема связана с кешем и происходит при выполнении запроса CORS.
Принуждение заголовка ответа Cache-Control
к no-cache
разрешило мою проблему:
[используя Symfony компонент HttpFoundation
<?php
$response->headers->add(array(
'Cache-Control' => 'no-cache'
));
Ответ 4
Я тоже получал такую же ошибку. Эта проблема была связана с правами пользователя веб-сервера на папку с кешем.
Ответ 5
В связи с тем, что кто-то высаживается здесь из-за проблем с их проектом ASP.net Core, я смог решить добавление промежуточного программного обеспечения IIS.
Это делается добавлением UseIISIntegration
при создании экземпляра вашего веб-хостинга.