Programmatically set InstanceContextMode

13,223

Solution 1

I'm answering my own question as I've found a solution in another answer on stackoverflow, and I think stackoverflow is a great place to search without even having to ask a question, so hopefully I will add to that richness by answering my own question with a link to the other answer and not just closing my own question.

My code now looks like this ...

public HttpWebService(string baseUri, string acceptType, TApi serviceInstance = null)
{
    _baseUri = baseUri;
    _acceptType = acceptType.ToLower();

    if (serviceInstance != null)
    {
        _host = new HttpServiceHost(serviceInstance, baseUri);
        var behaviour = _host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        behaviour.InstanceContextMode = InstanceContextMode.Single;
    }
    _host = _host ?? new HttpServiceHost(typeof (TApi), baseUri);

    _host.Open();
    _client = new HttpClient();
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_acceptType));
}

I changed this ...

_host = serviceInstance == null
            ? new HttpServiceHost(typeof (TApi), baseUri)
            : new HttpServiceHost(serviceInstance, baseUri);

... to this ...

if (serviceInstance != null)
{
    _host = new HttpServiceHost(serviceInstance, baseUri);
    var behaviour = _host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
    behaviour.InstanceContextMode = InstanceContextMode.Single;
}
_host = _host ?? new HttpServiceHost(typeof (TApi), baseUri);

Solution 2

Even though the original answer contains the solution it is Just a straight answer to the question

ServiceHost host = new ServiceHost(typeof(YourService)); //Or get the Servicehost
((ServiceBehaviorAttribute)host.Description.
Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode 
= InstanceContextMode.Single;
Share:
13,223
Shivang Gangadia
Author by

Shivang Gangadia

Updated on June 06, 2022

Comments

  • Shivang Gangadia
    Shivang Gangadia almost 2 years

    Is there a way to do this ...

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    ...programmatically?

    The reason is that I want to pass in an instance of my service directly into my self-hosting helper class when integration testing my service.

    I'm using Castle Windsor to create all my objects, which works fine when using the test web site. But I get the following error when I try to use my HttpWebService helper class ...

    System.InvalidOperationException was unhandled by user code
      Message=In order to use one of the ServiceHost constructors that takes a service instance, the InstanceContextMode of the service must be set to InstanceContextMode.Single.  This can be configured via the ServiceBehaviorAttribute.  Otherwise, please consider using the ServiceHost constructors that take a Type argument.
      Source=System.ServiceModel
    

    This is the constructor of my helper class ...

    public HttpWebService(string baseUri, string acceptType, TApi serviceInstance = null)
    {
        _baseUri = baseUri;
        _acceptType = acceptType.ToLower();
    
        _host = serviceInstance == null
                    ? new HttpServiceHost(typeof (TApi), baseUri)
                    : new HttpServiceHost(serviceInstance, baseUri);
        _host.Open();
        _client = new HttpClient();
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_acceptType));
    }
    

    So, I need to programmatically set the InstanceContextMode when in "integration test mode", ie - in my helper class.

    I think I need to do something like this ...

    if (serviceInstance != null)
    {
        _host = new HttpServiceHost(serviceInstance, baseUri);
        var whatDoIDoNow = null;
        _host.Description.Behaviors.Add(whatDoIDoNow);
    }
    

    Any help/guidance would be great as I'm really stuck on this.

  • Offler
    Offler over 11 years
    answer would be easier to read if it would containt only the solution instead of complete code again.
  • Matt Allen
    Matt Allen over 5 years
    Thanks. Just what I was looking for. Saved me research by my own.