2017-09-22 4 views
1

私は単純な.NET Core 2.0プロジェクトを持っています。ここでの設定方法は次のとおりです。UseStatusCodePagesWithReExecuteを使用すると、ステータスコードがブラウザに送信されません。

public void Configure(IApplicationBuilder app, IHostingEnvironment environment) 
{ 
    app.UseStatusCodePagesWithReExecute("/error/{0}.html"); 

    app.UseStaticFiles(); 

    app.UseMvc(routes => 
    { 
    routes.MapRoute(
     name: "default", 
     template: "{controller}/{action?}/{id?}", 
     defaults: new { controller = "Home", action = "Index" }); 
    }); 
    } 

私は、無効なURLを入力すると、/error/404.htmlが期待通りに表示されますが、ブラウザではなく、予想される404のステータスの、200のステータスコードを取得します。

私は間違っていますか?静的HTMLファイルをエラーページとして使用できないのですか?

+0

UseStaticFilesは、404.htmlを提供するときに200を設定する可能性があります。あなたはオプションのイベントでそれを上書きすることができます。 – Tratcher

答えて

0

もしapp.UseStatusCodePagesWithReExecuteあなたを使用

応答本体が代替 パスを使用して再実行要求パイプラインによって生成されなければならないことを指定StatusCodePagesミドルウェアを追加します。

パス/error/404.htmlが存在し、正常に動作するため、200のステータスが使用されます。


あなたは(より詳細な説明のためthis articleに見て)、次のアプローチを使用することができます:ステータスコードに基づいたビューを返します

セットアップアクションは、クエリパラメータとして

public class ErrorController : Controller 
{ 
    [HttpGet("/error")] 
    public IActionResult Error(int? statusCode = null) 
    { 
     if (statusCode.HasValue) 
     { 
      // here is the trick 
      this.HttpContext.Response.StatusCode = statusCode.Value; 
     } 

     //return a static file. 
     return File("~/error/${statusCode}.html", "text/html"); 

     // or return View 
     // return View(<view name based on statusCode>); 
    } 
} 
に合格

次に登録ミドルウェアを

このplリダイレクト中にaceholder {0}がステータスコードの整数に自動的に置き換えられます。

+0

ありがとうございました。この回答は少し助けになりました。しかし、ErrorControllerから私の静的な404.htmlにリダイレクトすることは可能ですか? –

+0

"error"はコントローラではなく "wwwroot"のディレクトリで、 "404.html"はwwwroot/errorディレクトリのhtmlファイルです。 –

+0

@BjarteAuneOlsen:アクションがビューの代わりに静的ファイルを返すように編集された回答がある(https://github.com/aspnet/Mvc/issues/3751を参照)。あなたは リダイレクトを使用する必要はありません。200 OK =>リダイレクトは次のように動作します:サーバーはLocationヘッダーと共に302コードを送信し、ブラウザはLocationヘッダーで指定された新しいURIを要求します代わりに。 – Set