2016-07-09 5 views
1

私たちのAPI上のすべての404に対してカスタムレスポンスを提供したいと思います。たとえば:カスタム404レスポンスモデル

{ 
    "message": "The requested resource does not exist. Please visit our documentation.." 
} 

私は、次の結果フィルタは、MVCパイプライン内のすべてのケースのために働くと考えている:

public class NotFoundResultFilter : ResultFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext context) 
    { 
     var result = context.Result as NotFoundResult; 

     if (result != null) 
     { 
      context.Result = new HttpNotFoundResult(); // My custom 404 result object 
     } 
    } 
} 

しかし、要求されたURLは、アクションのルートと一致しない場合、上記のフィルタではありませんヒット。 これらの404応答をどのようにして傍受できますか?ミドルウェアが必要ですか?

答えて

3

はい、フィルタはMVC専用ですので、ミドルウェアを使用する必要があります。

  1. あなたは、いつものように、独自のミドルウェア書き込むことがあり

    app.Use(async (context, next) => 
    { 
        await next(); 
        if (context.Response.StatusCode == 404) 
        { 
         context.Response.ContentType = "application/json"; 
    
         await context.Response.WriteAsync(JsonConvert.SerializeObject("your text"), Encoding.UTF8); 
        } 
    }); 
    
  2. または使用middlware StatusCodePagesMiddlewareを内蔵していますが、一つだけの状態を処理するように、これは特別な機能です。このミドルウェアは、応答ステータスコードを処理するために使用することができる。あなた400〜600であるConfigure方法(StatusCodePages Sampleの一例)に次の行のいずれかを添加StatusCodePagesMiddlewareを設定することができ:

    app.UseStatusCodePages(); // There is a default response but any of the following can be used to change the behavior. 
    
    // app.UseStatusCodePages(context => context.HttpContext.Response.SendAsync("Handler, status code: " + context.HttpContext.Response.StatusCode, "text/plain")); 
    // app.UseStatusCodePages("text/plain", "Response, status code: {0}"); 
    // app.UseStatusCodePagesWithRedirects("~/errors/{0}"); // PathBase relative 
    // app.UseStatusCodePagesWithRedirects("/base/errors/{0}"); // Absolute 
    // app.UseStatusCodePages(builder => builder.UseWelcomePage()); 
    // app.UseStatusCodePagesWithReExecute("/errors/{0}"); 
    
+0

ありがとうございます!私は、HttpContextにResultプロパティがないため、ミドルウェアがそのように動作するとは思わない。私はJSONを返すので、UseStatusCodePages()は適切でないかもしれないと思います。 – davenewza

+1

私は答えを更新しました – Set

+0

作品は404sと素晴らしいです。私はJwtBearerAuthenticationミドルウェアを使用している場合、401または403で動作するようには見えませんが、別の質問でこれを上げます。 – davenewza

関連する問題