策略注入ExceptionCallHandler不会触发处理程序

时间:2015-01-30 19:27:57

标签: c# asp.net-mvc exception-handling unity-container policy

我已经用这种方式配置了我的统一依赖:

<register type="IFeedController" mapTo="RaF.Controllers.FeedController, Raf">
    <interceptor type="VirtualMethodInterceptor"></interceptor>
    <interceptionBehavior type="Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior, Microsoft.Practices.Unity.Interception" />
</register>

我已经以这种方式设置了异常管理器:

public class ApplicationExceptionManager : IApplicationExceptionManager
{
    private Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager _exceptionManager;
    /// <summary>
    /// Gets EntLibs Exception Manager instance
    /// </summary>
    public ExceptionManager ExceptionManager
    {
        get { return _exceptionManager; }
    }
    public ApplicationExceptionManager()
    {
        var exceptionHandlingPolicies = new List<ExceptionPolicyDefinition>();
        var azureExceptionPolicies = ExceptionPolicies.AzureExceptionPolicies;
        var systemExceptionPolicies = ExceptionPolicies.SystemExceptionPolicies;
        var webAppExceptionPolicies = ExceptionPolicies.WebAppExceptionPolicies;
        exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.AzureExceptionPolicy, azureExceptionPolicies));
        exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.SystemExceptionPolicy, systemExceptionPolicies));
        exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.WebAppExceptionPolicy, webAppExceptionPolicies));

        _exceptionManager = new Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager(exceptionHandlingPolicies);
    }
    Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager IApplicationExceptionManager.ExceptionManager
    {
        get { return _exceptionManager; }
    }
}

然后我使用:

设置异常管理器
ExceptionManager manager = new ApplicationExceptionManager().ExceptionManager;
ExceptionPolicy.SetExceptionManager(manager, true);

然后允许我在我的控制器和依赖项上使用ExceptionCallHandlerAttribute

不幸的是,宣布的处理程序从未开火,而且我在丢失的地方迷路了。这是一个简单的ASP.NET MVC WebApi控制器项目,Unity作为依赖性解析器。

我应该检查下一步该怎么办?我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

ASP.Net MVC和WebAPI控制器不会使用接口或虚拟方法进行操作 - 因此Unity拦截器无法拦截此类操作调用。

如果您需要使用相应的动作过滤器来处理异常和其他横切关注点。您也可以将此类过滤器设置为全局过滤器。

注意:确保选择正确的过滤器 - 所有相关类看起来非常相似,并且很容易滥用WebAPI控制器的MVC属性。

答案 1 :(得分:0)

默认情况下,UnityConfig.cs未配置拦截扩展名。以下是完成的调整:

var container = new UnityContainer();
container.AddNewExtension<Interception>();
RegisterTypes(container);
return container;

需要添加新扩展程序。如果在依赖项上声明了拦截行为但是容器没有添加扩展,则Unity不会触发异常。它现在正常工作。此外,拦截在ApiController和Controller上也能正常工作,尽管使用Filters可能是合适的。