2015-01-30 1 views
0

Я настроил свою зависимость единства таким образом:Политика Injection ExceptionCallHandler не срабатывает обработчик

<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.

Что следует проверить? Я что-то пропустил?

ответ

0

Контроллеры ASP.Net MVC и WebAPI не используют интерфейсы или виртуальные методы для своих действий - поэтому перехватчики Unity не могут перехватывать такие вызовы действий.

Если вам нужно использовать соответствующие Action Filters для обработки исключений и других проблем, связанных с перекрестными ограничениями. Вы также можете установить такой фильтр, как глобальный фильтр.

Примечание: убедитесь, что выбрали правильные фильтры - все связанные классы выглядят очень похожими, и легко использовать атрибут MVC для контроллера WebAPI.

0

По умолчанию UnityConfig.cs не настроен с расширением перехвата. Ниже приводится сделанная корректировка:

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

Необходимо добавить новое расширение. Unity не запускает исключение, если поведение перехвата объявлено в зависимости, но в контейнере не добавлено расширение. Теперь он работает правильно. Кроме того, перехват действительно работает на ApiController и Controller, хотя может быть целесообразно использовать фильтры.