Мне трудно заставить перехватчики работать в приложении MVC, в котором размещаются службы WCF.
Я хочу добавить детальный контроль над АОП, используя классы / методы, украшенные атрибутами, но перехватчик никогда не вызывается с помощью средства WCF.
В Global.asax
У меня есть:
container = new WindsorContainer();
container.AddFacility<WcfFacility>();
container.Kernel.ComponentModelBuilder.AddContributor(new RequireAspects());
container.Install(FromAssembly.This());
RequireAspects
подключает перехватчики:
public class RequireAspects : IContributeComponentModelConstruction
{
if (Attribute.IsDefined(model.Implementation, typeof(CacheAttribute)))
{
model.Interceptors.Add(InterceptorReference.ForType(typeof(Caching)));
}
}
Перехватчик выглядит так:
public class CacheAttribute : Attribute { };
public class Caching : IInterceptor
{
...
}
Служба:
[Cache]
public class TestService : ITestService
{
...
}
И наконецслужбы установлены:
public class ServicesInstaller : IWindsorInstaller
{
public void Install(Castle.Windsor.IWindsorContainer container,
Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.InNamespace("Test.Services")
.Configure((c => c.LifestyleTransient())));
}
}
Конфигурация служб:
<system.serviceModel>
<services>
<service name="Test.Services.TestService">
<endpoint address=""
binding="webHttpBinding"
contract="Test.Services.ITestService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Перехватчик явно добавлен, и создан прокси, но перехватчик никогда не вызывается.
Я рассмотрел этот рабочий пример перехватчиков с WCF, но не соответствует моему варианту использования.
https://github.com/RussellPolitzky/Castle-Windsor-WCF-Service-With-Interceptor-and-Meta-Data-Publishing
Приведенный выше код работает для всех других случаев, в которых я используюАОП в MVC и библиотеках.