Dav*_*New 1 asp.net-core-mvc asp.net-core asp.net-core-1.0
我想为我们的API上的所有404提供自定义响应.例如:
{
"message": "The requested resource does not exist. Please visit our documentation.."
}
Run Code Online (Sandbox Code Playgroud)
我相信以下结果过滤器适用于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
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当请求的URL与操作路由不匹配时,不会触发上面的过滤器.我怎样才能最好地拦截这404条回复? 这需要中间件吗?
是的,您需要使用中间件,因为过滤器仅适用于MVC.
您可以像往常一样编写自己的中间件
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);
}
});
Run Code Online (Sandbox Code Playgroud)或者使用内置的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}");
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |