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

Я тоже получал такую ​​же ошибку. Эта проблема была связана с правами пользователя веб-сервера на папку с кешем.