Search code examples
wcfiisoperationwcf-behaviour

How to add OperationBehavior for all operations on IIS hosted WCF service?


I have a custom OperationBehavior. I would like to apply it for all operations at once. Unfortunately, OperationBehaviors cannot be configured per entire service or in web.config.

When hosting WCF service in a test application, I can do the following:

        foreach (var ep in _serviceHost.Description.Endpoints)
        {
            foreach (OperationDescription od in ep.Contract.Operations)
            {
                od.Behaviors.Add(new MyOperationBehavior());
            }
        }

        _serviceHost.Open();

But how do I do it in a IIS hosted web application?

I tried to get OperationContext.Current.Host.Description.Endpoints in Application_Start but of course OperationContext.Current is not available before any operation has started, so my approach fails.


Solution

  • You can use a ServiceHostFactory to do that. With it, you can get access to the OM prior to the service being opened.

    This is an example:

    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;
        }
    }
    

    And you can get more information about service host factories at https://learn.microsoft.com/en-us/archive/blogs/carlosfigueira/wcf-extensibility-servicehostfactory