Ily*_*dik 9 error-handling asp.net-web-api asp.net-core-mvc asp.net-core
在我基于普通MVC和WebApi的应用程序中,我有两种不同的错误处理路径.
如果在WebApi调用期间发生错误,我会拦截它(使用标准的web api选项)并返回带有相应HTTP状态代码的json消息,以便客户端应用程序可以处理它.
如果错误发生在MVC中,那么我会使用一些标准处理程序,可能会根据状态代码将用户重定向到某个默认错误屏幕.
现在在ASP.NET Core中,两者都加入了相同的框架,所以如果我只是拦截并返回JSON,那么我冒险向用户显示json,因为它可以是一个返回视图的动作.另一方面,如果我使用app.UseExceptionHandler那么我的API调用将从错误页面获取HTML,这在js中是不可用的.
为这两种情况提供单独的错误处理的好方法是什么?或者也许有更好的方法来处理它?
PS我宁愿重用开箱即用的MVC异常处理程序,只添加web api部分.
ade*_*lin 12
有很多方法可以实现您的目标:
1-使用两个不同的异常过滤器(我会采用这种方法,因为你的问题是关于mvc pipline)
执行:
// For api
public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
// send error as json
}
}
[ApiExceptionFilter]
public class ApiController : Controller{...}
// For mvc
public class MvcExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
// send view result
}
}
[MvcExceptionFilter]
public class HomeController : Controller{...}
Run Code Online (Sandbox Code Playgroud)
如果要全局添加过滤器,请参阅注册区域的过滤器
2-使用UseWhen和UseExceptionHandler
app.UseWhen(x => x.Request.Path.Value.StartsWith("/api"), builder =>
{
builder.UseExceptionHandler(new ExceptionHandlerOptions()
{
ExceptionHandler = async (ctx) =>
{
var feature = ctx.Features.Get<IExceptionHandlerFeature>();
var error = feature?.Error;
// send json
}
});
});
app.UseWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
{
builder.UseExceptionHandler("/Error");
});`
Run Code Online (Sandbox Code Playgroud)
3- UseExceptionHandler有条件地使用:
app.UseExceptionHandler(new ExceptionHandlerOptions()
{
ExceptionHandler = async (ctx) =>
{
if (ctx.Request.Path.Value.StartsWith("/api"))
{
var feature = ctx.Features.Get<IExceptionHandlerFeature>();
var error = feature?.Error;
// send json
}
else
{
// redirect error page
}
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2195 次 |
| 最近记录: |