Программно задано значение InstanceContextMode
Есть ли способ сделать это...
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
... программно?
Причина в том, что я хочу передать экземпляр моего сервиса непосредственно в мой класс помощника хостинга при интеграции тестирования моего сервиса.
Я использую Castle Windsor для создания всех моих объектов, что отлично работает при использовании тестового веб-сайта. Но я получаю следующую ошибку, когда я пытаюсь использовать вспомогательный класс HttpWebService...
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
Это конструктор моего вспомогательного класса...
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));
}
Итак, мне нужно программно установить InstanceContextMode
, когда в "режиме тестирования интеграции", т.е. - в моем классе-помощнике.
Я думаю, мне нужно сделать что-то вроде этого...
if (serviceInstance != null)
{
_host = new HttpServiceHost(serviceInstance, baseUri);
var whatDoIDoNow = null;
_host.Description.Behaviors.Add(whatDoIDoNow);
}
Любая помощь/руководство будет замечательным, поскольку я действительно застрял в этом.
Ответы
Ответ 1
Я отвечаю на свой вопрос, так как нашел решение в другом answer в stackoverflow, и я думаю, что stackoverflow - отличное место для поиска, даже не имея задавать вопрос, поэтому, надеюсь, я добавлю к этому богатству, отвечая на свой вопрос, ссылаясь на другой ответ, а не только на закрытие моего собственного вопроса.
Теперь мой код выглядит так...
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));
}
Я изменил это...
_host = serviceInstance == null
? new HttpServiceHost(typeof (TApi), baseUri)
: new HttpServiceHost(serviceInstance, baseUri);
... к этому...
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);
Ответ 2
Несмотря на то, что исходный ответ содержит решение, это просто прямой ответ на вопрос
ServiceHost host = new ServiceHost(typeof(YourService)); //Or get the Servicehost
((ServiceBehaviorAttribute)host.Description.
Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode
= InstanceContextMode.Single;