我想在MVC或Web API层有一组拦截器捕获任何异常,获取生成异常的URI,并从配置中查找回发给用户的消息。
例如,对/ api / v1 /用户抛出唯一约束违规的POST将被配置为响应“用户已存在”,而POST / api / v1 / vehicle的相同异常将响应“VIN已经在系统”。
Unity中是否有任何设施?如果没有,是否有人有公开来源的例子?
答案 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
。