如何在错误处理操作中确定我应该 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");
});