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



google-chrome web-applications (5)

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

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

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


Answers

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


Я сталкивался с этой ошибкой при создании файла и отправке его пользователю для загрузки, но только изредка. Когда это не удалось, файл был последовательно 2 байта короче. Close () принудительно закрывает соединение, независимо от того, завершено оно или нет, и в моем случае это не было. Отказ от этого, как предложено в вопросе, означал, что полученный файл содержал как сгенерированный контент, так и HTML-код для всей страницы.

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

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

с

context.Response.End();

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



В соответствии с 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) { }
}

Проверьте наличие таких слов, как «объявление», «баннер» или «всплывающее окно» в вашем файле. Я удалил их, и это сработало. Основываясь на этом сообщении здесь: Не удалось загрузить ресурс в Chrome, похоже, что Ad Block Plus был виновником в моем случае.





c# google-chrome iis web-applications