Как добавить 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.

Другие вопросы по тегам