2012-01-17 13 views
34

वहाँ यह करने के लिए एक रास्ता है ...प्रोग्राम सेट InstanceContextMode

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

... प्रोग्राम के रूप में?

कारण यह है कि मैं अपनी सेवा के एकीकरण में अपनी सेवा का परीक्षण करते समय सीधे अपने स्वयं के होस्टिंग सहायक वर्ग में अपनी सेवा के उदाहरण में गुजरना चाहता हूं।

मैं अपनी सभी वस्तुओं को बनाने के लिए कैसल विंडसर का उपयोग कर रहा हूं, जो परीक्षण वेबसाइट का उपयोग करते समय ठीक काम करता है। लेकिन मैं निम्नलिखित त्रुटि मिलती है जब मैं अपने 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); 
} 

किसी भी मदद/मार्गदर्शन महान के रूप में मैं वास्तव में इस पर अटक कर रहा हूँ होगा।

उत्तर

47

मैं अपने ही सवाल का जवाब कर रहा हूँ के रूप में मैं stackoverflow पर एक और answer में एक समाधान मिल गया है, और मुझे लगता है कि 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); 
+3

उत्तर पढ़ने के लिए आसान होगा अगर यह फिर से पूर्ण कोड के बजाय समाधान को दूषित करेगा। – Offler

1

हालांकि मूल उत्तर में यह समाधान होता है जो प्रश्न

प्रश्न का एक सीधा जवाब है
ServiceHost host = new ServiceHost(typeof(YourService)); //Or get the Servicehost 
((ServiceBehaviorAttribute)host.Description. 
Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode 
= InstanceContextMode.Single; 
संबंधित मुद्दे