Как добавить OperationBehavior для всех операций службы IIS, размещенной на сервере IIS?
У меня есть пользовательские операции поведения. Я хотел бы применить его для всех операций одновременно. К сожалению, OperationBehaviors нельзя настроить для всей службы или в файле web.config.
При размещении службы WCF в тестовом приложении я могу сделать следующее:
foreach (var ep in _serviceHost.Description.Endpoints)
{
foreach (OperationDescription od in ep.Contract.Operations)
{
od.Behaviors.Add(new MyOperationBehavior());
}
}
_serviceHost.Open();
Но как мне сделать это в веб-приложении IIS?
Я пытался получить OperationContext.Current.Host.Description.Endpoints
в Application_Start
но конечно OperationContext.Current
is not available before any operation has started, so my approach fails.
2 ответа
Вы можете использовать ServiceHostFactory
сделать это. С его помощью вы можете получить доступ к ОМ до открытия сервиса.
Это пример:
public class MyFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
foreach (var ep in host.Description.Endpoints)
{
foreach (OperationDescription od in ep.Contract.Operations)
{
od.Behaviors.Add(new MyOperationBehavior());
}
}
return host;
}
}
Более подробную информацию о фабриках хостов службы можно получить по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx
В конце я нашел альтернативное решение: использовать контрактное поведение, которое вводит любой другой бевайор по мере необходимости. Как это:
public class InjectAllOperationsBehavior : Attribute, IContractBehavior
{
private IOperationBehavior _operationBehavior = null;
public InjectAllOperationsBehavior(Type operationBehaviorType)
{
_operationBehavior =
(IOperationBehavior)Activator.CreateInstance(operationBehaviorType);
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
foreach (OperationDescription opDescription in contractDescription.Operations)
{
opDescription.Behaviors.Add(_operationBehavior);
}
}
... другие методы IContractBehavior можно оставить пустыми. Вы также можете использовать метод ApplyClientBehavior с тем же кодом из метода ApplyDispatchBehavior.