2011-05-20 26 views
13

में डब्ल्यूसीएफ सेवा होस्ट करने में समस्या मेरे पास एक डब्ल्यूसीएफ सेवा है जो विंडोज सेवा के अंदर होस्ट की जाती है।विंडोज सेवा

protected override void OnStart(string[] args) 
{ 
    serviceHost = new ServiceHost(typeof (RouterService)); 
    serviceHost.Open(); 
} 

अब यह काफी कम है, के बाद से मैं इस समस्या को खोजने के लिए कोशिश कर रहा हूँ: Windows सेवा एक OnStart विधि इस तरह है। चूंकि मैंने यहां कोई त्रुटि नहीं डाली है, इस बिंदु पर किसी भी अपवाद ने सेवा को ठीक से शुरू करने से रोक दिया होगा। यह शुरू होगा, और फिर स्वचालित रूप से तुरंत बंद हो जाएगा।

WCF सेवा के लिए मेरे कॉन्फ़िग फ़ाइल इस तरह दिखता है:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <system.serviceModel> 
    <services> 
     <service name="WcfService.RouterService" 
       behaviorConfiguration="serviceBehavior" > 
     <endpoint address="RouterService" contract="WcfService.IRouterService" binding="wsHttpBinding" bindingConfiguration="NoSecurity" /> 
     <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="NoSecurity"> 
      <security mode="None" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="serviceBehavior" > 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

इसके अलावा, मैं जोड़ लिया है नेटवर्क सेवा उपयोगकर्ता (जो सेवा के रूप में निर्दिष्ट बंदरगाह पर Http को सुनने के लिए सक्षम होने के लिए चल रहा है :।।

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE" 

अब, क्लाइंट में, मैं Add Service Reference चुनें मैं सर्वर पा सकते हैं, और वी.एस. भी विन्यास बना सकते हैं और प्रॉक्सी फ़ाइलें बनाने के लिए प्रबंधन तो ग्राहक के अंदर, मैं प्रॉक्सी का एक उदाहरण बनाने के , और इसे खोलो। सब कुछ ठीक है। लेकिन सी पर

HTTP http://localhost:8000/RouterService पर स्थित सेवा बहुत व्यस्त है: प्रॉक्सी पर पहली विधि Alling, मैं निम्नलिखित अपवाद मिलता है।

मुझे पता है कि मेरा ग्राहक एकमात्र चीज है जो इस सेवा से कनेक्ट करने का प्रयास कर रहा है, तो मुझे यह त्रुटि संदेश क्यों मिलता है? और मैं इसे कैसे ठीक कर सकता हूं? जब यह विधि को कॉल करने का प्रयास करता है, तो यह समय समाप्त नहीं होता है, यह लगभग तुरंत अपवाद फेंकता है।

संपादित

ठीक है, अब मुझे पता चला मेरी TestServer (नहीं विंडोज क्लाइंट एक है, लेकिन एक सांत्वना आवेदन) भी एक ही त्रुटि देता है कि। इससे पहले आज ऐसा नहीं हुआ, और न ही डब्ल्यूसीएफ सेवा या टेस्टसेवर बदल गए हैं।

फिर मैंने बंदरगाह को 8000 के बजाय 8080 में बदलने की कोशिश की, और यह काम किया। फिर मैंने विंडोज सेवा के लिए भी कोशिश की, और यह भी काम किया (netsh http नए पोर्ट पर कमांड चलाने के बाद)

तो किसी कारण से पोर्ट 8000 पर http के साथ कुछ हुआ है। मैंने निश्चित रूप से सिस्टम को पुनरारंभ करने का प्रयास किया है।

यह मुझे परेशान कर रहा है, इसलिए यदि किसी को पता है कि यहां क्या हो रहा है, तो मैं इसकी सराहना करता हूं।

+0

आपकी सेवा किस प्रकार लौट रही है? मैंने इस समस्या को उन सेवाओं में देखा है जो अनसुलझा प्रकारों को वापस करते हैं। सेवा होस्ट के लिए यह शुरू करने या उस तरह कुछ करने के लिए एप्लिकेशन पूल में भी समस्या हो सकती है। – Henric

+1

मैं @daft से सहमत हूं कि सेवा क्रमिकरण समस्याओं के कारण डेटा प्रकार वापस करने में विफल हो सकती है। लागू होने पर आवेदन पूल चिंता का विषय नहीं होना चाहिए क्योंकि यह वही पूल (कम से कम आईआईएस में) है जो wsdl/config की सेवा करता है जो आपको प्रॉक्सी क्लास (जिसे आपने सफलतापूर्वक किया है) उत्पन्न करने की अनुमति देता है। ऐप पूल समस्या को स्पष्ट करने के लिए – Smudge202

+0

+1। धन्यवाद धुंध। – Henric

उत्तर

13

ठीक है, यहां क्या हुआ, यह जानने का प्रयास करने के लंबे समय बाद, मुझे समाधान मिला।

विंडोज़ सेवा बनाने के बाद, और इसे शुरू करने का प्रयास करने के बाद मैं ऐसा नहीं कर सका क्योंकि मुझे नेटवर्क्स सेवा उपयोगकर्ता को http 8000 पहले सुनने के लिए पंजीकरण करना था।

netsh http जोड़ने urlacl url = http: // +: मैं इसलिए इस आदेश भागा 8000/RouterService उपयोगकर्ता = "नेटवर्क सेवा"

यह एक सफल परिणाम दे दी है, लेकिन फिर मैं शुरू करने की कोशिश की सेवा, और एक ही त्रुटि संदेश मिला।अब मेरे खिड़कियों 8000/उपयोगकर्ता = "नेटवर्क सेवा"

यह एक सफल परिणाम दे दी, और:

netsh http जोड़ने urlacl url = http: // + तब मैं निर्दिष्ट RouterService बिना ही आदेश भागा बिना किसी समस्या के सेवा शुरू हुई, लेकिन मुझे ऊपर दिए गए प्रश्न में उल्लिखित समस्याएं मिलीं।

ऐसा लगता है कि नेटस् के लिए पहली कॉल इन सभी समस्याओं का कारण बनती है। मैं इस आदेश के साथ फिर से इसे हटाने की कोशिश की:

netsh http urlacl url = http हटाना: // +: 8000/RouterService

और फिर सब कुछ पूरी तरह से काम किया।

एक कुतिया के बाद से अपवाद वास्तविक समस्या से कोई संबंध नहीं था इस डिबग करने के लिए है, इसलिए मुझे आशा है कि इस सवाल का किसी और कुछ घंटों बचा सकता है :)

4

पर विचार @ Øyvind-Knobloch-brathen के जवाब के बाद "उपयोगकर्ता" कमांड लाइन कुंजी के बजाय जाने-माने एसआईडी स्ट्रिंग का उपयोग करने के लिए, यह आपको क्रॉस कल्चर पोर्टेबिलिटी देगा (मुझे फ्रेंच-स्थानीयकृत विन 7 मशीन पर समस्याएं आ रही हैं)। अधिक जानकारी के लिए SID strings देखें। आपके मामले के लिए यह होगा:

netsh http urlacl यूआरएल जोड़ने = http: // +: 8000/SDDL = "हे: एन एस"

a link to SDDL on MSDN