wcf web api - and - Establecer programáticamente InstanceContextMode
web api rest c# (2)
Hay alguna forma de hacer esto ...
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
... programáticamente?
La razón es que quiero pasar una instancia de mi servicio directamente a mi clase de ayuda de alojamiento autónomo cuando la prueba de integración prueba mi servicio.
Estoy usando Castle Windsor para crear todos mis objetos, lo que funciona bien cuando uso el sitio web de prueba. Pero recibo el siguiente error cuando trato de usar mi clase de ayuda 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
Este es el constructor de mi clase de ayuda ...
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));
}
Entonces, necesito configurar programáticamente el InstanceContextMode
cuando InstanceContextMode
en "modo de prueba de integración", es decir, en mi clase de ayuda.
Creo que necesito hacer algo como esto ...
if (serviceInstance != null)
{
_host = new HttpServiceHost(serviceInstance, baseUri);
var whatDoIDoNow = null;
_host.Description.Behaviors.Add(whatDoIDoNow);
}
Cualquier ayuda / orientación sería genial ya que estoy realmente atrapado en esto.
Aunque la respuesta original contiene la solución, es solo una respuesta directa a la pregunta
ServiceHost host = new ServiceHost(typeof(YourService)); //Or get the Servicehost
((ServiceBehaviorAttribute)host.Description.
Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode
= InstanceContextMode.Single;
Estoy respondiendo mi propia pregunta ya que encontré una solución en otra answer en , y creo que es un gran lugar para buscar sin siquiera tener que hacer una pregunta, así que con suerte voy a aumentar esa riqueza respondiendo a la mía pregunta con un enlace a la otra respuesta y no solo cerrando mi propia pregunta.
Mi código ahora se ve así ...
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));
}
Cambié esto ...
_host = serviceInstance == null
? new HttpServiceHost(typeof (TApi), baseUri)
: new HttpServiceHost(serviceInstance, baseUri);
... a esto ...
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);