除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作。
新增AI编程课程,引领技术教育新趋势
除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作。
public class ExceptionMessage { private object errorMessage; public string Message { get; private set; } public string Description { get; private set; } public IDictionary<string,string> ValidationErrors { get; private set;} public ExceptionMessage(ExceptionContext context) { if (context.ModelState != null && context.ModelState.Any(m => m.Value.Errors.Any())) { this.Message = "Model validation failed."; this.ValidationErrors = context.ModelState.Keys .SelectMany(key => context.ModelState[key].Errors.ToDictionary(k => key, v => v.ErrorMessage)) .ToDictionary(k => k.Key, v => v.Value); } else { this.Message = context.Exception.Message; this.Description = context.Exception.StackTrace; } } }
由于本文重点不是错误消息结构,不过在Microsoft REST API准则 Github存储库中提供了一些错误消息准则,这些可能会给你带来帮助。
现在您的错误响应理想情况下是一条JSON消息,但是让我们将序列化留给应用程序的管道并返回一个ObjectResponse派生实例。为此我创建了ErrorObjectResult。
using Microsoft.AspNetCore.Mvc; using System.Net; namespace CzarCms.Models { public class ErrorObjectResult : ObjectResult { public ErrorObjectResult(object value, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) : base(value) { StatusCode = (int)statusCode; } } }
除了获取状态代码的构造函数(默认为500内部服务器错误)和ObjectResponse基础构造函数的对象之外,此类中没有什么特别之处。我们在本文中关注的核心组件是我们的自定义ExceptionFilterAttribute派生类。
public class ApiExceptionFilter : ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { var errorMessage = new ExceptionMessage(context); if (context.ModelState.ErrorCount==0) context.Result =