C# web api和Mvc Razor中的Dotnet核心错误处理
在我的web应用程序中,我有web API和普通MVC 我已经为httpResponse创建了一个扩展C# web api和Mvc Razor中的Dotnet核心错误处理,c#,asp.net-core,asp.net-core-mvc,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 = exceptionMess
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);
}
});
});
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var error=context.Features.Get();
if(错误!=null)
{
context.Response.ShowApplicationError(error.error.Message,error.error.InnerException.Message);
}
});
});
像这样。
这两种方法都适用。
我想区分每个请求的错误。我不想显示mvc end的json错误,我该怎么做。HttpRequest中的ContentType和Accept标头区分输出类型,这在您的情况下已经足够了 您可以使用Accept标头进行检查
if (context.Request.Headers["Accept"] == "application/json" || context.Request.Headers["Accept"] == "application/xml")
{
//Api Request
}
else
{
//other request.
}
这种情况的最佳解决方案是更好地分离您的关注点。将api与MVC应用程序分开。它还将为以后的部署提供灵活性。如果这是现有代码而不是新代码,我会游说将其重构为一个单独的api项目。您无法直接将内部服务器错误与MVC或web api与
错误区分开来。对于MVC
和webapi
,它们都继承自Controller
或ControllerBase
通常,我们通过向web api的路由路径添加api
来区分它们。我建议您使用mvc设计您的项目,而不使用api路由,使用带有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);
}
});
});
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var error=context.Features.Get();
var error1=context.Features.Get()作为ExceptionHandlerFeature;
var error2=context.Features.Get();
var requestPath=error2.Path;
if(错误!=null)
{
context.Response.ShowApplicationError(error.error.Message,error.error.InnerException.Message);
}
});
});
这必须适用于以下两种情况:。。。有什么问题?请定义您的问题我想知道一个mvc请求,这样我可以以不同的方式发送错误。编辑postAFAIK没有内置的方法来实现这一点。无论是API请求还是MVC请求,内部都是一样的。尝试将API分离到特定区域,然后您可以使用区域
令牌区分请求并返回相关类型的响应在调用app.UseExceptionHandler之前您是否尝试调用app.useMvc?因此我必须为each@Selik没有必要分成两个项目,您可以在同一个项目中定义mvc控制器和web api控制器,只需确保为每个web api控制器添加[Route(“api/[controller]”)]
。哦,对不起,您指的是“ExceptionHandlerFeature.Path”是有效的。谢谢。