在我的Web应用程序中,我同时拥有Web API和常规MVC 我已经为httpResponse创建了扩展名
public static void ShowApplicationError(this HttpResponse response, string exceptionMessage,string innerException)
{
var result = JsonConvert.SerializeObject(new { error = exceptionMessage ,detail=innerException });
response.HttpContext.Response.WriteAsync(result);
}
,并在startup.cs中用于异常处理。
app.UseExceptionHandler(builder =>
{
builder.Run(async context =>
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var error = context.Features.Get<IExceptionHandlerFeature>();
if (error != null)
{
context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
}
});
});
像这样。 它的工作都很好。 我想区分每个请求的错误。我不想显示Mvc结束的json错误,我该怎么做。
答案 0 :(得分:1)
您无法直接将MVC的内部服务器错误或Error.Message
的Web api区别开来。对于MVC
和Web api
,它们都从Controller
或ControllerBase
继承。
通常,我们通过在Web api的路由路径中添加api
来区分它们。我建议您通过不带api路由的mvc和带有api路由的web api设计项目。然后通过ExceptionHandlerFeature.Path
检查路径。
app.UseExceptionHandler(builder =>
{
builder.Run(async context =>
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var error = context.Features.Get<IExceptionHandlerFeature>();
var error1 = context.Features.Get<IExceptionHandlerFeature>() as ExceptionHandlerFeature;
var error2 = context.Features.Get<IExceptionHandlerPathFeature>();
var requestPath = error2.Path;
if (error != null)
{
context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
}
});
});
答案 1 :(得分:0)
HttpRequest中的ContentType和Accept Header区分输出类型,这足以满足您的情况。
您可以使用“接受标头”进行检查。
if (context.Request.Headers["Accept"] == "application/json" || context.Request.Headers["Accept"] == "application/xml")
{
//Api Request
}
else
{
//other request.
}
答案 2 :(得分:0)
针对这种情况的最佳解决方案是更好地分离您的疑虑。将您的api与MVC应用程序分开设置为csproj。它将为您提供灵活性,以便以后进行部署。如果这是现有代码而不是新代码,我会游说将其重构为一个单独的api项目。