最近、Chromeの問題に遭遇しました。
私は、プライマリがjsonデータを返すHttpHandlerを使用して、自作のAPIを作成しました。しかし、エラーが発生したとき、htmlファイルを表示したかったのです。これはIEとFFでかなりうまくいきましたが、Chromeではうまくいきませんでした。
開発者ツールを調べると、次のエラーが明らかになりました:net :: ERR_INCOMPLETE_CHUNKED_ENCODING
グーグルは、この問題についてはあまり見ていなかったが、あまり言っていない。私が知ったのは、しばらくすると魔法のように消えていくということだけでした。
次のコード行にあることがわかりました。
result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error
最後の行を削除すると、うまくいきました。なぜChrome=に問題があった/あるのかわからないが、chrome読み終える前に応答ストリームを閉じたかのようだった。
同じ問題または類似の問題に直面している皆さんの助けになることを願っています。
さて、私の質問:応答ストリームを閉じる/フラッシュするのに最適な方法は何ですか?ルールはありますか?
ASP.NETは、応答の早期フラッシュ時に転送エンコードをチャンクとして設定します :
Http要求の応答ストリームを早めにフラッシュし、応答のContent-Lengthヘッダーが明示的に設定されていない場合、ASP.NETはデータをチャンクエンコーディング(Transfer-Encoding:chunked)でクライアントに転送します。
Solution:フラッシュ時にASP.NETが応答をチャンク化しないように、応答のContent-Lengthヘッダーを明示的に設定する必要があります。
ASP.NETが必要なヘッダーを設定して応答をチャンク化するのを防ぐために使用したC#コードを次に示します。
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();
これは同じことですが、トランザクションを短くすることはありません。
私の場合、問題はキャッシュ関連であり、CORSリクエストを行うときに発生していました。
応答ヘッダーの強制Cache-Control
からno-cache
私の問題を解決しました:
[Symfonyを使用 HttpFoundation コンポーネント]
<?php
$response->headers->add(array(
'Cache-Control' => 'no-cache'
));
ASP.net Coreプロジェクトの問題の結果として誰かがここに着陸したという不幸なことに、私は IISミドルウェア を追加することで解決できました。
これは、Webホストインスタンスをインスタンス化するときに UseIISIntegration
を追加 によって行われます。
私も同じエラーを受け取っていました。この問題は、キャッシュフォルダーのWebサーバーユーザー権限にありました。
かつて同じ問題が発生し、主な理由はコントローラーの戻り値のタイプにありました。 C# object
をas-isのみを返そうとすると、net::ERR_INCOMPLETE_CHUNKED_ENCODING
のみを取得するため、前にserializeを忘れないでください。 Java script
クライアント(またはView
)に送信します。すなわち、私のコントローラの戻り値のタイプは次のとおりでした:
public async Task<List<ComplexModel>> GetComplexModelList(){
return new List<ComplexModel>()
}
これによりINCOMPLETE_CHUNKED_ENCODING
エラーが発生したため、次のようなエラーを修正しようとしました。
using Newtonsoft.Json;
...
public async Task<string> GetComplexModelList(){
return JsonConvert.SerializeObject(new List<ComplexModel>())
}