Web API和Mvc Razor中的Dotnet Core错误处理

时间:2018-12-19 09:05:19

标签: c# asp.net-core asp.net-core-mvc

在我的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错误,我该怎么做。

3 个答案:

答案 0 :(得分:1)

您无法直接将MVC的内部服务器错误或Error.Message的Web api区别开来。对于MVCWeb api,它们都从ControllerControllerBase继承。

通常,我们通过在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项目。