2009-08-10 9 views
9

मैं विंडोज सेवा और मेरी सेवा जीयूआई में होस्ट किए गए डब्ल्यूसीएफ के बीच संवाद करने की कोशिश कर रहा हूं। समस्या है जब मैं विधि OperationContract निष्पादित करने के लिए मैं हो रही हैकैसे हल करें "चैनल डिस्पैचर अपने आईसीएचनल लिस्टनर को खोलने में असमर्थ है" त्रुटि?

कोशिश कर रहा हूँ कि " पर ChannelDispatcher 'net.tcp: // स्थानीय होस्ट: 7771/MyService' अनुबंध के साथ (रों) '" IContract " ' अपने आईसीएचनल लिस्टनर को खोलने में असमर्थ है। "

मेरे app.conf कि तरह लग रहा है:

<configuration> 
<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
      <binding name="netTcpBinding"> 
       <security> 
        <transport protectionLevel="EncryptAndSign" /> 
       </security> 
      </binding> 
     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:7772/MyService" /> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" 
      name="MyService.Service"> 
      <endpoint address="net.tcp://localhost:7771/MyService" binding="netTcpBinding" 
       bindingConfiguration="netTcpBinding" name="netTcp" contract="MyService.IContract" /> 
     </service> 
    </services> 
</system.serviceModel> 

पोर्ट 7771 सुन रहा है (netstat का उपयोग कर जाँच की) और svcutil मेरे लिए कॉन्फ़िगरेशन उत्पन्न करने में सक्षम है।

किसी भी सुझाव की सराहना की जाएगी।


ढेर अपवाद से ट्रेस

Server stack trace: 
    at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 
    at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

वहाँ एक भीतरी अपवाद है (लेकिन Exeption.InnerExeption के तहत नहीं, बल्कि Exeption.Detail.InnerExeption के तहत - ToString() विधि नहीं करता ' टी दिखाएं कि)

एक पंजीकरण यूआरआई 'net.tcp: // localhost: 7771/MyService' के लिए पहले से मौजूद है।

लेकिन मेरी सेवा ने इस यूआरआई को केवल app.config फ़ाइल में कहीं और निर्दिष्ट नहीं किया है। पूरे समाधान में इस यूआरआई एपर्स सर्वर में एक बार और ग्राहक एक बार।

+0

क्या आप हमें "thexxception.ToString()" का उपयोग करके एक पूर्ण स्टैक ट्रेस दे सकते हैं। यह सभी आंतरिक अपवाद प्रदर्शित करेगा। इस तरह के अपवाद के साथ कभी-कभी एक और मूल कारण होता है। –

उत्तर

4

मैं इसे हल: डी

यहाँ समस्या का explanaition है:

पहले खराब कोड:

namespace WCFServer 
{ 
    public class Program : IWCFService 
    { 
     private ServiceHost host; 

     static void Main(string[] args) 
     { 
      new Program(); 
     } 

     public Program() 
     { 
      host = new ServiceHost(typeof(Program)); 

      host.Open(); 

      Console.WriteLine("Server Started!"); 

      Console.ReadKey(); 
     } 

     #region IWCFService Members 

     public int CheckHealth(int id) 
     { 
      return (1); 
     } 

     #endregion 
    } 
} 

आप देख सकते हैं सेवा अनुबंध होस्टिंग सेवा कक्षा में कार्यान्वित किया जाता है। इससे पूरी त्रुटि चीज हुई (शायद टाइपऑफ() एक कन्स्ट्रक्टर चलाता है, मुझे नहीं पता कि मैं इस मामले में रचनात्मक इनपुट के लिए खुला हूं)।

अच्छा कोड: दोनों फ़ाइलों के लिए

namespace WCFServer 
{ 
    public class Program 
    { 
     private ServiceHost host; 

     static void Main(string[] args) 
     { 
      new Program(); 
     } 

     public Program() 
     { 
      host = new ServiceHost(typeof(WCF)); 

      host.Open(); 

      Console.WriteLine("Server Started!"); 

      Console.ReadKey(); 
     } 
    } 

    public class WCF : IWCFService 
    { 

     #region IWCFService Members 

     public int CheckHealth(int id) 
     { 
      return (1); 
     } 

     #endregion 
    } 
} 

सेवा अनुबंध:

[ServiceContract] 
public interface IWCFService 
{ 
    [OperationContract] 
    int CheckHealth(int id); 
} 

अनुप्रयोग।config

<configuration> 
<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="WCFBehavior" /> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <netTcpBinding> 
      <binding name="tcpBinding"> 
       <security> 
        <transport> 
         <extendedProtectionPolicy policyEnforcement="Never" /> 
        </transport> 
       </security> 
      </binding> 
     </netTcpBinding> 
    </bindings> 
    <services> 
     <service name="WCFServer.WCF"> 
      <endpoint address="net.tcp://localhost:1111/TcpIHostMonitor" binding="netTcpBinding" 
       bindingConfiguration="tcpBinding" name="netTcpEndpoint" contract="WCFServer.IWCFService" /> 
     </service> 
    </services> 
</system.serviceModel> 

1

शायद बंदरगाह पहले से ही आपके मशीन पर एक एंटीवायरस प्रोग्राम की तरह किसी अन्य प्रोग्राम द्वारा उपयोग किया जा रहा है? या यह एक विंडोज आरक्षित बंदरगाह है। क्या आप पोर्ट को 11111 जैसे कुछ सेट करने का प्रयास कर सकते हैं?

+0

दुर्भाग्य से यह नहीं है। मैंने विभिन्न बंदरगाहों की कोशिश की है (7771, 7772, 7773)। बंदरगाह मेरी सेवा बंद करने के बाद नेटस्टैट आउटपुट से अपमानजनक है, इसलिए शायद उन पर कुछ और नहीं सुन रहा है: / – kyrisu

7

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

0

मुझे लगता है कि विन्यास के इस हिस्से

<message clientCredentialType="UserName" /> 

नजरअंदाज कर दिया है जब आप

<security mode = "Transport"> 
0

सेट मैं ओ पी के रूप में ही कारण के लिए इस अपवाद का सामना करना पड़ा लेकिन मैं अपने सेवा के कार्यान्वयन स्थानांतरित नहीं कर सकता एक नई कक्षा में। तो, मुझे एक और समाधान मिला। ServiceHost में दूसरा अधिभार है जो एक सेवा का उदाहरण लेता है। मैं जानता हूँ कि आप पहले से ही समस्या हल

namespace WCFServer 
{ 
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] // required 
    public class Program : IWCFService 
    { 
     private ServiceHost host; 

     static void Main(string[] args) 
     { 
      new Program(); 
     } 

     public Program() 
     { 
      host = new ServiceHost(this); // changed 
      host.Open(); 

      Console.WriteLine("Server Started!"); 
      Console.ReadKey(); 
     } 

     #region IWCFService Members 

     public int CheckHealth(int id) 
     { 
      return (1); 
     } 

     #endregion 
    } 
} 
1

, लेकिन कोई ध्यान दिलाया कारण है कि यह समस्या हल हो, और क्या त्रुटि के कारण: इस प्रकार, यहाँ परिवर्तन ओ पी के 'बुरे' कोड के लिए लागू कर रहे हैं। मुद्दा w/आपका पहला कोड यह था कि आपके प्रोग्राम (क्लास प्रोग्राम) ने कक्षा में एक खुली कॉल निर्दिष्ट की जो कि "क्लास प्रोग्राम" था, दूसरे शब्दों में, यह रिकवरी है। कोई आश्चर्य नहीं कि यह श्रोता त्रुटि को खोलने में असमर्थ था! यह एक अच्छा वाला था! :-)

संबंधित मुद्दे