2010-05-12 14 views
5

मुझे एक होस्ट/क्लाइंट डब्ल्यूसीएफ सेवा और क्लाइंट मिला है जो netTcp बाइंडिंग और कॉलबैक विधि का उपयोग कर रहा है।डब्ल्यूसीएफ, डुप्लेक्स कॉलबैक, रिसीवटाइमआउट नेट टीसीपी बाइंडिंग

<bindings> 
     <netTcpBinding> 
     <binding name="tcp_Unsecured" receiveTimeout="00:01:00" sendTimeout="00:01:00"> 
      <security mode="None" /> 
      <reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00"/> 
     </binding> 
     </netTcpBinding> 
</bindings> 

प्रॉक्सी कॉलबैक साथ

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples", ConfigurationName="AlarmServer", CallbackContract=typeof(AlarmServerCallback), SessionMode=System.ServiceModel.SessionMode.Required)] 
public interface AlarmServer 
{ 

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/RegisterAlarm")] 
    void RegisterAlarm(System.DateTime alarmTime, string clientName, string reminderMessage); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/unRegisterAlarm")] 
    void unRegisterAlarm(string clientName); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/broadcastMessage")] 
    void broadcastMessage(string msg); 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
public interface AlarmServerCallback 
{ 

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/SignalAlarm")] 
    void SignalAlarm(string reminderMessage); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/displayMessage")] 
    void displayMessage(string msg); 
} 

ग्राहक उदाहरण

public MainForm() 
{ 
    InitializeComponent(); 
    InstanceContext context = new InstanceContext(new AlarmCallback()); 
    client = new AlarmServerClient(context); 
} 

समस्या मेरे पास है बाध्यकारी recieveTimeout से चलाता है के बाद, ग्राहक एक गलती राज्य में चला जाता है और सुनने ग्राहकों बंद कर देता है वापस कॉल करें।

मैं sysinternals से TCPVIEW का उपयोग कर सुनना बंदरगाह ड्रॉप देख सकता हूं।

यदि मैं चैनल व्यस्त रहता हूं, तो टाइम आउट ट्रिगर नहीं होता है, इसलिए यह सर्वर/क्लाइंट को डब्ल्यूसीएफ संदेश में कोई गलती नहीं है, क्योंकि एकाधिक संदेश ठीक से बहते हैं।

मैंने सोचा था कि प्राप्त टाइमटाइम को यह पता लगाने के लिए डिज़ाइन किया गया था कि टीसीपी पर डब्ल्यूसीएफ संदेश से कोई जवाब असफल रहा है या नहीं? यह कनेक्शन को क्यों दोष दे रहा है। यह लगभग प्रतीत होता है कि यदि टाइमआउट अवधि के लिए कोई कॉलबैक ऑब्जेक्ट नहीं बनाया गया है, तो चैनल बंद कर दिया जाता है?

मैं क्या गलत कर रहा हूं?

+0

क्या आपको इसका कोई समाधान मिला है? –

उत्तर

2

क्या आपने प्रॉक्सी सृजन (क्लाइंट) में डुप्लेक्सChannelFactory का उपयोग करने का प्रयास किया है? यहाँ उसके उपयोग के तरीके (नई AlarmServerClient का उपयोग कर निर्माण (संदर्भ) की जगह) है:

AlarmServer proxy = new DuplexChannelFactory<AlarmServer>(context,"YourAlarmServerEndpoint").CreateChannel(); 

संपादित करें: लॉग सक्षम करना ट्रेस विश्लेषण करने के लिए:

इसकी संभव चैनलों संचार विश्लेषण करने के लिए, सक्षम करने से संदेश लॉगिंग और ट्रेस: ​​

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add name="ServiceModelMessageLoggingListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <source name="System.ServiceModel" switchValue="Information,ActivityTracing" 
    propagateActivity="true"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add name="ServiceModelTraceListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
</sources> 
<sharedListeners> 
    <add initializeData="Your_svclog_file_here" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
    <add initializeData="Your_svclog_file_here" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
</sharedListeners> 
<trace autoflush="true" /> 

इस मामले में, ट्रेस "सूचना" लॉग करने में सक्षम है। चैनल निर्माण को देखना महत्वपूर्ण है।

svclog फ़ाइल का विश्लेषण करने, आप सेवा ट्रेस दर्शक का उपयोग कर सकते हैं - माइक्रोसॉफ्ट विंडोज एसडीके, आमतौर पर सी में: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ बिन \ SvcTraceViewer.exe

+0

कोशिश की, मदद करने के लिए प्रतीत नहीं हुआ। मैं अभी भी परेशान !! – PrimeTSS

+0

Ive भी बाइंडिंग सरलीकृत और समय बहिष्कार और reliablesession गुण <बाध्यकारी नाम = "tcp_Unsecured"> से छुटकारा मिला <सुरक्षा मोड = "कोई नहीं" /> फिर भी कॉल बैक चैनल में चला जाता है एक " दोष "राज्य (यह जानना अच्छा लगता है कि इस गलती पर और जानकारी क्यों प्राप्त करें?) – PrimeTSS

+0

लॉग सक्षम करके, आप विश्लेषण कर सकते हैं कि संचार कहां क्रैश हो रहा है। आशा करता हूँ की ये काम करेगा! – Erup

5

लगता है रिसीवटाइम आउट कॉलबैक होस्ट सेवा को इसकी अधिकतम गणना तक पहुंचने के बाद गलती का कारण बनता है। जो 23.5 9 बजे या 1 मिनट का डिफ़ॉल्ट है। मैं कर सकते हैं स्थापित करने receivetimeout साथ टाइमआउट समस्या हल हो गई

<bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_AlarmServer" receiveTimeout="infinite" > 
      <security mode="None" />   
     </binding> 
     </netTcpBinding> 
    </bindings> 

infinate के लिए लेकिन यह अगर im वास्तव में सर्वर/ग्राहक संचार के लिए WFC में सही उपकरण का उपयोग कर मुझे अब सोच रहा है। मैं एक फ़ाइल सर्वर पर एक होस्ट/सर्वर चलाना चाहता हूं, और उससे जुड़े कई रिमोट क्लाइंट। क्लाइंट सर्वर को दिल की धड़कन से पिंग करेगा, और कभी-कभी सर्वर क्लाइंट को एक कमांड भेज सकता है। मैं इसे रीमोटिंग या टीसीपीएसकेट्स के साथ कर रहा था और "क्लाइंट मतदान विधि" का उपयोग कर रहा था, जहां डेटाबेस में क्विक्यूड कमांड और जब क्लाइंट ने प्रत्येक 10 मिनट में कमांड के लिए सर्वर पर मतदान किया, तो उस अद्वितीय क्लाइंट के लिए लंबित कमांड था यह।यह ठीक काम करता था, और सर्वर के लिए 1000 खुले टीसीपी सॉकेट कनेक्शन नहीं होने का लाभ था, क्योंकि क्लाइंट केवल यादृच्छिक रूप से कनेक्ट और डिस्कनेक्ट होगा। लेकिन मैंने डब्ल्यूसीएफ को आजमाने का फैसला किया (यह सब रीमोटिंग की जगह महान लोगों में नया नहीं है?) और जब मुझे डुप्लेक्स मैंने सोचा, तो आईडी इसका उपयोग करें .... अब मैं सोच रहा हूं कि डब्ल्यूसीएफ डुप्लक्स के बारे में क्या बात है ???

सहायता मैं यहां अवधारणाओं को याद कर रहा हूं ???

4

जिस मूल्य पर प्राप्तकर्ता समय सेट है, वह सेवा को बताएगा कि संचार चैनल को दोष देने से पहले कितना इंतजार करना है जब कोई एप्लिकेशन संदेश प्राप्त नहीं होता है। आप हमेशा इस टाइमआउट मान को अधिक संख्या में बढ़ा सकते हैं (डिफ़ॉल्ट 10 मिनट है), लेकिन फिर आपको सत्र निष्क्रियता टाइमआउट भी बढ़ाना होगा। इन दोनों टाइमआउट्स पर अधिक जानकारी के लिए कृपया http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.receivetimeout.aspx देखें।

जब प्राप्त या निष्क्रियता टाइमआउट आग लगती है, तो डुप्लेक्स चैनल को दोष दिया जाता है। सर्वर के साथ संवाद करने में सक्षम होने के लिए आपको क्लाइंट पक्ष पर एक नई प्रॉक्सी बनाना होगा।

सर्वर को कॉल करने का प्रयास करने से पहले आप हमेशा क्लाइंट पक्ष पर चैनल कनेक्शन स्थिति की जांच कर सकते हैं। यदि चैनल का संचार स्तर खोला नहीं गया है, तो आप सर्वर को कॉल करने से पहले एक नया प्रॉक्सी बना सकते हैं।

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