web-dev-qa-db-de.com

IIS & Chrome: Ressource konnte nicht geladen werden: net :: ERR_INCOMPLETE_CHUNKED_ENCODING

Ich bin kürzlich auf ein Chrome-Problem gestoßen, das meiner Meinung nach wert ist, es mit Ihnen zu teilen.

Ich habe an einer selbstgeschriebenen API mit einem HttpHandler gearbeitet, der primär Json-Daten zurückgeben soll. Wenn jedoch ein Fehler auftritt, wollte ich eine HTML-Datei anzeigen. Das hat in IE und FF ziemlich gut funktioniert, aber nicht in Chrome.

Ein Blick auf die Entwicklertools ergab diesen Fehler: net :: ERR_INCOMPLETE_CHUNKED_ENCODING

Google hat nicht sehr viel zu diesem Problem gesagt, während es sehr viel gesehen wurde. Alles was ich erfuhr war, dass es nach einiger Zeit magisch verschwand.

Ich habe herausgefunden, dass es in diesen Codezeilen liegt:

result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error

Nach dem Entfernen der letzten Zeile funktionierte es gut. Ich weiß nicht, warum nur Chrome ein Problem damit hatte/hatte, aber es schien, als hätte ich den Antwort-Stream geschlossen, bevor Chrome es gelesen hatte.

Ich hoffe, es hilft denjenigen von Ihnen, die auf das gleiche oder ein ähnliches Problem stoßen.

Nun meine Frage: Wie lautet die beste Praxis beim Schließen/Löschen des Antwortstreams? Gibt es Regeln?

19
christoph

Gemäß setzt ASP.NET die Übertragungskodierung beim vorzeitigen Leeren der Antwort auf "chunked" :

ASP.NET überträgt die Daten in verschlüsselter Codierung (Transfer-Encoding: chunked) an den Client, wenn Sie den Response-Stream für die HTTP-Anforderung vorzeitig leeren und der Content-Length-Header für die Antwort nicht explizit von Ihnen festgelegt wird. 

Solution: Sie müssen den Content-Length-Header für die Antwort explizit festlegen, um zu verhindern, dass ASP.NET die Antwort beim Leeren aufteilt.

Hier ist der C # -Code, den ich verwendet habe, um zu verhindern, dass ASP.NET die Antwort durch das Festlegen des erforderlichen Headers blockiert:

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) { }
}
12
rumis

Ich habe diese Fehlermeldung erhalten, als ich eine Datei generierte und sie zum Download an den Benutzer weiterleitete, jedoch nur gelegentlich. Wenn dies nicht fehlschlug, war die Datei immer 2 Bytes kurz. Close () schließt die Verbindung zwangsweise, unabhängig davon, ob sie beendet ist oder nicht, und in meinem Fall war dies nicht der Fall. Das Auslassen, wie in der Frage vorgeschlagen, bedeutete, dass die resultierende Datei sowohl den generierten Inhalt als auch den HTML-Code für die gesamte Seite enthielt.

Die Lösung hier war zu ersetzen

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

mit

context.Response.End();

das tut das gleiche, aber ohne die Transaktion zu verkürzen.

9
Pawtuxet

Aufgrund des Problems, dass jemand aufgrund von Problemen mit seinem ASP.net Core-Projekt hier landet, konnte ich das Problem lösen, indem ich die Middleware IIS hinzufügte .

Dies geschieht durch Hinzufügen von UseIISIntegration bei der Instantiierung Ihrer Webhost-Instanz.

1

Ich bekam auch den gleichen Fehler. Dieses Problem betraf die Webserver-Benutzerberechtigung für den Cache-Ordner.

1
Vinay Shankar

In meinem Fall war das Problem Cache-bezogen und trat bei einer CORS-Anforderung auf.

Das Erzwingen des Antwort-Headers Cache-Control zu no-cache hat mein Problem behoben:

[mit Symfony HttpFoundation Komponente]

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

Sobald ich dasselbe Problem hatte und der Hauptgrund darin lag, dass ich in meinem Controller-Rückgabetyp läge. Wenn Sie versuchen, einen C# object nur as-is zurückzugeben, erhalten Sie nur net::ERR_INCOMPLETE_CHUNKED_ENCODING. Vergessen Sie also nicht serialisieren Sie Ihre komplexen Objekte, bevor Sie sie für Java script client (oder View) . versenden Mein Controller-Rückgabetyp war:

public async Task<List<ComplexModel>> GetComplexModelList(){
    return new List<ComplexModel>()
}

Was INCOMPLETE_CHUNKED_ENCODING Fehler verursacht hat, also habe ich versucht, meinen Fehler mit etwas zu beheben:

using Newtonsoft.Json;
...
public async Task<string> GetComplexModelList(){
    return JsonConvert.SerializeObject(new List<ComplexModel>())
}
0
AmiNadimi