Unity例外拦截 - 配置

时间:2017-11-28 15:45:43

标签: c# asp.net-mvc asp.net-web-api unity-container

我想在MVC或Web API层有一组拦截器捕获任何异常,获取生成异常的URI,并从配置中查找回发给用户的消息。

例如,对/ api / v1 /用户抛出唯一约束违规的POST将被配置为响应“用户已存在”,而POST / api / v1 / vehicle的相同异常将响应“VIN已经在系统”。

Unity中是否有任何设施?如果没有,是否有人有公开来源的例子?

1 个答案:

答案 0 :(得分:1)

Unity不是在ASP.NET应用程序中自定义错误响应的正确工具。它是一个依赖注入容器,您希望它只是实例化具有所有必需依赖项的控制器。将它与应用程序逻辑混合是一个坏主意(定制错误响应肯定是它的一部分)。

ASP.NET MVC和ASP.NET Web API提供了一个适合您所需内容的扩展点 - 异常过滤器。以下是ASP.NET Web API的示例:

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        //  Add  your exception handling here

        //  Check context.Exception and decide whether you need to handle it
        if (context.Exception is SqlException)
        {
            var controllerType = context.ActionContext.ControllerContext.Controller.GetType();

            if (controllerType == typeof(UserController))
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.Conflict)
                {
                    Content = new StringContent("User already exists")
                };
            }
            else
            {
                // Cover other controller types here
            }
        }
    }
}

正如您所见,实施是公平的直截了当。在OnException()方法内部,您可以通过控制器和操作上下文访问异常。 如果您的逻辑要求应为此控制器操作处理此异常,则只需使用适当的context.Response填充HttpResponseMessage,然后选择HTTP状态代码和正文。

您可以使用

全局应用此类例外过滤器
GlobalConfiguration.Configuration.Filters.Add(new CustomExceptionFilterAttribute());

在您的WebApiConfig.Register(HttpConfiguration config)或控制器级别:

[CustomExceptionFilter]
public class UserController : ApiController

ASP.NET MVC的实现非常相似。在这种情况下,您的过滤器应该实现System.Web.Mvc.IExceptionFilter