2016-07-09 2 views
1

Я хочу предоставить пользовательский ответ для всех 404 в нашем API. Например:Пользовательская модель ответа 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 .Вы можете настроить StatusCodePagesMiddleware добавив одну из следующей строки в Configure метода (например, из StatusCodePages Sample):

    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. Я считаю, что UseStatusCodePages() может не подойти, поскольку я хочу вернуть JSON. – davenewza

+1

Я обновил ответ – Set

+0

Отлично работает с 404s. Я не могу заставить его работать с 401 или 403s при использовании промежуточного программного обеспечения JwtBearerAuthentication, но я подниму это на другой вопрос. – davenewza

Смежные вопросы