【问题标题】:Policy Injection ExceptionCallHandler doesn't fire handler策略注入 ExceptionCallHandler 不会触发处理程序
【发布时间】:2015-03-30 08:40:09
【问题描述】:

我以这种方式配置了我的统一依赖项:

<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 作为 Dependency Resolver。

接下来我应该检查什么?我错过了什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        相关资源
        最近更新 更多