在使用常规ASP.NET Web API多年后,我开始使用ASP.NET Core作为我的新REST API项目.我没有看到在ASP.NET Core Web API中处理异常的好方法.我试图实现异常处理过滤器/属性:
public class ErrorHandlingFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
HandleExceptionAsync(context);
context.ExceptionHandled = true;
}
private static void HandleExceptionAsync(ExceptionContext context)
{
var exception = context.Exception;
if (exception is MyNotFoundException)
SetExceptionResult(context, exception, HttpStatusCode.NotFound);
else if (exception is MyUnauthorizedException)
SetExceptionResult(context, exception, HttpStatusCode.Unauthorized);
else if (exception is MyException)
SetExceptionResult(context, exception, HttpStatusCode.BadRequest);
else
SetExceptionResult(context, exception, HttpStatusCode.InternalServerError);
}
private static void SetExceptionResult(
ExceptionContext context,
Exception exception,
HttpStatusCode code)
{
context.Result = new JsonResult(new ApiResponse(exception))
{ …Run Code Online (Sandbox Code Playgroud) MVC6/WebApi中的模板WebApi控制器实现了一个返回Get方法集合的操作,如下所示:
[HttpGet]
public IEnumerable<MyEntity> Get()
{
//my code to return entities
}
Run Code Online (Sandbox Code Playgroud)
假设我的代码返回结果会引发异常,我将如何向消费者返回错误消息?
据我所知,异常会导致HTTP 500.这很好,但我想给调用者一个消息,告诉他出了什么问题.由于模板操作的签名,我无法捕获异常并返回一些Http***或ObjectResult实例.
我试图以下列方式返回状态代码
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "invalid username/password" });
Run Code Online (Sandbox Code Playgroud)
现在这在MVC6中不受支持,因为使用IActionResult看起来对我来说真的很傻,而且不太直观.我找到了以下帖子一和二.第一个导致链接断开,第二个适用于MVC应用程序.
我确实意识到我需要创建一个中间件来解决这个问题,但我不知道从哪里开始,因为这是非常有用的东西,我希望有一些我可以使用的开源解决方案或者可能是代码片段.
为了记录,我使用ASP.net 5 rc1更新1 MVC 6