如何在错误处理操作中确定我应该 return 网络视图还是 api 响应
How in error handling action determine should I return web view or api response
在 Asp.net 核心项目中,我同时拥有 Web UI 和 Web API 控制器。
我关注了 https://www.devtrends.co.uk/blog/handling-errors-in-asp.net-core-web-api 文章并包含在 startup.cs:
app.UseStatusCodePagesWithReExecute("/Error/error/{0}");
app.UseExceptionHandler("/Error/error/500");
并在 ErrorController 中添加了错误处理操作:
[Route("error/{code}")]
public IActionResult Error(int code)
{
return new ObjectResult(new ApiResponse(code));
}
这适用于网页 api,但不适用于网页。对于 api 我们想要 return 自定义对象(序列化为 JSON),但是对于 UI 我们想要 return 自定义视图。
我想写点像
public IActionResult Error(int code)
{
if(CalledFromApiClient())
{
return new ObjectResult(new ApiResponse(code));
}
else
return View(“Error”);
}
问题是如何实现CalledFromApiClient?
我正在考虑将所有 api 控制器保留在 api subfolder/namespace 中,并使用调用堆栈查找是否从 api 控制器抛出异常。
应该可以用,但是看起来不太好
有什么更好的方法吗?
终于在同一个作者的博客里找到了答案https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core
A common example for this requirement is a project with both MVC and
API actions where you want to error handling to be different for each.
我们假设 url 路径遵循 api 控制器操作从段开始 "api"
的约定
// returns Api error response
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");
appBuilder.UseExceptionHandler("/apierror/500");
});
// returns MVC error page
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/error/{0}");
appBuilder.UseExceptionHandler("/error/500");
});
在 Asp.net 核心项目中,我同时拥有 Web UI 和 Web API 控制器。 我关注了 https://www.devtrends.co.uk/blog/handling-errors-in-asp.net-core-web-api 文章并包含在 startup.cs:
app.UseStatusCodePagesWithReExecute("/Error/error/{0}");
app.UseExceptionHandler("/Error/error/500");
并在 ErrorController 中添加了错误处理操作:
[Route("error/{code}")]
public IActionResult Error(int code)
{
return new ObjectResult(new ApiResponse(code));
}
这适用于网页 api,但不适用于网页。对于 api 我们想要 return 自定义对象(序列化为 JSON),但是对于 UI 我们想要 return 自定义视图。 我想写点像
public IActionResult Error(int code)
{
if(CalledFromApiClient())
{
return new ObjectResult(new ApiResponse(code));
}
else
return View(“Error”);
}
问题是如何实现CalledFromApiClient?
我正在考虑将所有 api 控制器保留在 api subfolder/namespace 中,并使用调用堆栈查找是否从 api 控制器抛出异常。 应该可以用,但是看起来不太好
有什么更好的方法吗?
终于在同一个作者的博客里找到了答案https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core
A common example for this requirement is a project with both MVC and API actions where you want to error handling to be different for each.
我们假设 url 路径遵循 api 控制器操作从段开始 "api"
的约定// returns Api error response
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");
appBuilder.UseExceptionHandler("/apierror/500");
});
// returns MVC error page
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/error/{0}");
appBuilder.UseExceptionHandler("/error/500");
});