c# - IIS & Chrome: не удалось загрузить ресурс: net:: ERR_INCOMPLETE_CHUNKED_ENCODING




google-chrome web-applications (4)

В моем случае проблема была связана с кэшем и возникала при выполнении запроса CORS.

Принуждение заголовка ответа Cache-Control к no-cache решило мою проблему:

[используя компонент Symfony HttpFoundation ]

<?php
$response->headers->add(array(
   'Cache-Control' => 'no-cache'
));

Недавно я столкнулся с проблемой 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 имел / имеет проблему с этим, но казалось, что я закрыл поток ответов до того, как Chrome закончил его читать.

Я надеюсь, что это поможет тем из вас, кто сталкивается с той же или подобной проблемой.

Теперь мой вопрос: как лучше всего закрыть / очистить поток ответов? Есть ли правила?


В соответствии с ASP.NET устанавливает кодирование передачи как chunked при преждевременной очистке Ответа :

ASP.NET передает данные клиенту в чанкованном кодировании (Transfer-Encoding: chunked), если вы преждевременно очищаете поток ответа для запроса Http, а заголовок Content-Length для ответа явно не установлен вами.

Решение . Вам необходимо явно установить заголовок Content-Length для Response, чтобы предотвратить разбиение ответа ASP.NET при сбросе.

Вот код C #, который я использовал для предотвращения разбиения ответа 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 байта короче. Close () принудительно закрывает соединение, независимо от того, завершено оно или нет, и в моем случае это не было. Отказ от этого, как предложено в вопросе, означал, что полученный файл содержал как сгенерированный контент, так и HTML-код для всей страницы.

Решение здесь было заменить

context.Response.Flush();
context.Response.Close();

с

context.Response.End();

который делает то же самое, но без сокращения сделки.


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





web-applications