ASP.NET Core中使用自定义MVC过滤器属性的依赖注入
标签:
原文:ASP.NET Core中使用自定义MVC过滤器属性的依赖注入除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作。
ASP.NET Core中常用的MVC过滤器之一是 ExceptionFilterAttribute,用于处理Wep API应用程序中的错误响应。它很容易实现,开发人员和我在ASP.NET Core中使用MVC过滤器属性所面临的问题是访问Startup.cs类中注入的组件。这些通常是配置,环境或日志记录。
通常依赖注入对象的一个??非常有用的用法,例如上面提到的IEnvironment,IConfiguration和ILogger <T>,是您正在实现的MVC过滤器属性的不同行为。根据这些值,您的属性行为可能会有所不同。例如,您不希望将错误详细信息和堆栈跟踪公开给Production Web API服务错误响应,尤其是在该服务端点是公共的情况下。您希望仅针对隔离的开发和登台环境执行此操作。
示例MVC过滤器属性在一个自定义ExceptionFilterAttrubute类的简单示例中,我将向您演示如何在自定义属性中使用依赖注入对象。让我们从代码开始吧。
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; } } }由于本文重点不是错误消息结构,,不过在 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派生类。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/40128.html
- 上一篇:elementUI上传组件改造
- 下一篇:js点击事件