2014-06-23 9 views
5

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

[ServiceContract(Namespace="net.tcp://namespace.MyService", 
    SessionMode=SessionMode.Required, 
    CallbackContract=typeof(IServiceCallback))] 
public interface IMyService 
{ 
    [OperationContract(IsOneWay=true)] 
    void DoWork(); 
} 


public interface IServiceCallback 
{ 
    [OperationContract(IsOneWay=true)] 
    void SendMessage(string message); 
} 

कार्यान्वयन के रूप में परिभाषित किया गया है:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, 
    InstanceContextMode = InstanceContextMode.PerSession, 
    UseSynchronizationContext = false, 
    IncludeExceptionDetailInFaults = true)] 
public class MyService : IMyService 
{ 
    public void DoWork() 
    { 
     var callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>(); 
     callback.SendMessage("Hello, world."); 
    } 
} 

ग्राहक के लिए विन्यास इस प्रकार है: सेवा के लिए

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="net.tcp" receiveTimeout="02:00:00" sendTimeout="02:00:00" maxReceivedMessageSize="2147483647"> 
      <security mode="None"/> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://localhost:8000/MyService/MyService" 
      binding="netTcpBinding" bindingConfiguration="net.tcp" contract="ExternalServiceReference.IMyService"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

कॉन्फ़िग :

<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="serviceBehaviour"> 
     <serviceMetadata /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <netTcpBinding> 
    <binding name="netTcp" sendTimeout="01:00:00" receiveTimeout="01:00:00" > 
     <security mode="None"> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="serviceBehaviour" name="MyService.MyService"> 
    <endpoint address="MyService" binding="netTcpBinding" bindingConfiguration="netTcp" name="net.tcp" contract="MyService.IMyService" /> 
    <endpoint binding="mexTcpBinding" bindingConfiguration="" name="net.tcp" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8000/MyService" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

ग्राहक की contructor में:

var callback = new CallbackImplementation(); 
_context = new InstanceContext(callback); 
_proxy = new MyServiceProxy(_context); 

मैं इससे पहले कि मैं एक नया कनेक्शन स्थापित निम्नलिखित कोशिश कर रहा हूँ:

 try 
     { 
      if (_context != null) 
      { 
       _context.ReleaseServiceInstance(); 
       _context.Close();      
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
      if (_context != null) 
      { 
       _context.Abort(); 
      } 
     } 

मुद्दा मैं देख रहा हूँ यह है कि _context.Close() कॉल हमेशा समय निकालता है और अपवाद फेंकता है। हालांकि मैं चैनल को निरस्त कर रहा हूं, लेकिन यह मेरे लिए गलत लगता है, और मेरा मानना ​​है कि यह मेरे आवेदन में ठंड का कारण है। क्या कोई जानता है कि बंद() कॉल क्यों विफल हो जाती है?

संपादित करें: मुझे अपने कॉलबैक कार्यान्वयन के संबंध में कुछ पहले याद आया जो प्रासंगिक हो सकता है। ।।

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Single, 
    UseSynchronizationContext = false, 
    IncludeExceptionDetailInFaults = true)] 
public class CallbackImplementation : IServiceCallback 
{ 
    public void SendMessage(string message) 
    { 
     // Do something with the message 
    } 
} 

अपवाद संदेश "है ServiceHost पास आपरेशन 00:00:30 के बाद का समय समाप्त हो इसका कारण यह है एक ग्राहक के लिए आवश्यक समय के भीतर एक sessionful चैनल को बंद करने में विफल हो सकता है समय: यह इस तरह दिखता है इस ऑपरेशन को आवंटित लंबे समय तक का एक हिस्सा हो सकता है। " कोई आंतरिक अपवाद नहीं है।

धन्यवाद

+0

'ऑनक्लोस' ईवेंट हैंडलर जोड़ने का प्रयास करें। देखें कि ईवेंट को 'कॉलबैक' सर्वर पक्ष पर निकाल दिया गया है या नहीं। – mrtig

+0

धन्यवाद, मैंने अभी कोशिश की है: समापन और बंद घटनाएं दोनों फायरिंग कर रहे हैं। – MrShoes

+0

लेकिन सेवा अभी भी समय समाप्त हो रही है? क्या आपने बाध्यकारी पर 'CloseTimeout' सेट करने का प्रयास किया है? – mrtig

उत्तर

0

मुद्दा न केवल संगामिति, लेकिन बाध्यकारी प्रकार था।

यह सुनिश्चित करना कि सेवा और कॉलबैक दोनों के समेकन मोड सही दिशा में एक कदम था। लेकिन netTcp बाइंडिंग से बाध्यकारी को wsDualHttp बाइंडिंग में बदलकर अंततः

0

आप receiveTimeout = "अनंत" की कोशिश की, देखने के लिए अगर आप अभी भी त्रुटि प्राप्त की है। आप बस पाते हैं कि यह त्रुटि बनाने में टाइमआउट नहीं है। क्या आपने बेस क्लाइंट क्लास बनाने के बारे में सोचा है जो भौतिक रूप से बंद होने तक स्वचालित रूप से कनेक्शन को जीवित रखता है?

1

मुझे कोई समस्या नहीं दिख रही है, लेकिन मुझे अक्सर लगता है कि क्लाइंट और सर्वर दोनों पर चल रहे निशान और परिणामों की जांच आमतौर पर मुझे समाधान के लिए इंगित करती है। इसे अपने .config फ़ाइलों (क्लाइंट और सर्वर) में रखें, सुनिश्चित करें कि पथ मौजूद फ़ोल्डर में इंगित करता है। अपना ऐप चलाएं, विफलता प्राप्त करें, फिर सबकुछ बंद करें और परिणामों को पढ़ने के लिए SvcTraceViewer.exe चलाएं।

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Information,ActivityTracing" 
     propagateActivity="true"> 
     <listeners> 
      <add name="xml" /> 
     </listeners> 
     </source> 
     <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
      <add name="xml" /> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add initializeData="C:\logs\TracingAndLogging-service.svclog" type="System.Diagnostics.XmlWriterTraceListener" 
     name="xml" /> 
    </sharedListeners> 
    <trace autoflush="true" /> 
</system.diagnostics> 
0

एक अनुमान में, यह ConcurrencyMode.Single के उपयोग की वजह से एक गतिरोध हो सकता है।

क्या हो रहा है यह है कि सर्वर क्लाइंट को वापस कॉल करने का प्रयास कर रहा है, जबकि यह अभी भी मूल अनुरोध (या इसके विपरीत) को संसाधित कर रहा है। तो सर्वर क्लाइंट को वापस कॉल करने का प्रयास कर रहा है, लेकिन क्लाइंट अवरुद्ध है क्योंकि यह अभी भी सर्वर से प्रतिक्रिया की प्रतीक्षा कर रहा है। अरे प्रतिष्ठा, डेडलॉक और अंततः एक टाइमआउट।

http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx

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