Programmatically set InstanceContextMode
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;
Shivang Gangadia
Updated on June 06, 2022Comments
-
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 over 11 yearsanswer would be easier to read if it would containt only the solution instead of complete code again.
-
Matt Allen over 5 yearsThanks. Just what I was looking for. Saved me research by my own.