Je suis récemment tombé sur un problème lié à Chrome qui, à mon avis, mérite d'être partagé avec vous.
J'ai travaillé sur une API auto-écrite utilisant un HttpHandler dont le principal devrait renvoyer des données JSON. Mais quand une erreur survient, je voulais afficher un fichier HTML. Cela fonctionnait plutôt bien dans IE et FF, mais pas dans Chrome.
La recherche d'outils de développement a révélé cette erreur: net :: ERR_INCOMPLETE_CHUNKED_ENCODING
Google a dit pas beaucoup sur ce problème alors qu'il a été vu beaucoup. Tout ce que je savais, c’était qu’il disparaissait comme par magie après un certain temps.
J'ai découvert qu'il se trouve sur ces lignes de code:
result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error
Après avoir supprimé la dernière ligne, cela a bien fonctionné. Je ne sais pas pourquoi seul Chrome avait/avait un problème avec cela, mais il semblait que je fermais le flux de réponses avant que Chrome ne l’ait lu.
J'espère que cela aidera ceux d'entre vous qui rencontrent le même problème ou un problème similaire.
Maintenant ma question: Quelle est la meilleure pratique pour fermer/purger le flux de réponses? Y a-t-il des règles?
Selon ASP.NET définit le codage de transfert sur chunked lors du vidage prématuré de la réponse :
ASP.NET transfère les données au client selon un codage en bloc (Transfer-Encoding: chunked), si vous videz prématurément le flux de réponse pour la demande Http et que l'en-tête Content-Length pour la réponse n'est pas explicitement défini par vous.
Solution: vous devez définir explicitement l'en-tête Content-Length de la réponse pour empêcher ASP.NET de fragmenter la réponse lors du vidage.
Voici le code C # que j'ai utilisé pour empêcher ASP.NET de fragmenter la réponse en définissant l'en-tête requis:
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) { }
}
Je rencontrais cette erreur lors de la génération d'un fichier et de son transfert à l'utilisateur pour téléchargement, mais seulement à l'occasion. Quand cela n'a pas échoué, le fichier était toujours court de 2 octets. Close () ferme de force la connexion, qu'elle soit terminée ou non, et dans mon cas, elle ne l'était pas. En laissant de côté, comme suggéré dans la question, le fichier résultant contenait à la fois le contenu généré et le code HTML de la page entière.
La solution ici remplaçait
context.Response.Flush();
context.Response.Close();
avec
context.Response.End();
qui fait la même chose, mais sans raccourcir la transaction.
En dépit du fait que quelqu'un atterrisse ici à la suite de problèmes avec son projet ASP.net Core, j'ai pu résoudre le problème en en ajoutant le middleware IIS .
Ceci est fait en en ajoutant UseIISIntegration
lors de l'instanciation de votre instance d'hôte Web.
J'avais aussi la même erreur. Ce problème concernait l'autorisation d'utilisateur du serveur Web sur le dossier de cache.
Dans mon cas, le problème était lié au cache et se produisait lors d'une requête CORS.
Forcer l'en-tête de réponse Cache-Control
à no-cache
a résolu mon problème:
[utilisant Symfony HttpFoundation composant]
<?php
$response->headers->add(array(
'Cache-Control' => 'no-cache'
));
Une fois, j’ai eu le même problème et la raison principale était dans le type de retour de mon contrôleur . Si vous essayez de renvoyer un C# object
juste tel quel , vous n’obtiendrez que net::ERR_INCOMPLETE_CHUNKED_ENCODING
alors n'oubliez pas de sérialisez vos objets complexes avant de les envoyer pour Java script
client (ou View
) . mon type de retour de contrôleur était:
public async Task<List<ComplexModel>> GetComplexModelList(){
return new List<ComplexModel>()
}
Ce qui a causé l'erreur INCOMPLETE_CHUNKED_ENCODING
. J'ai donc essayé de corriger mon erreur avec quelque chose comme:
using Newtonsoft.Json;
...
public async Task<string> GetComplexModelList(){
return JsonConvert.SerializeObject(new List<ComplexModel>())
}