मेरे पास एक डब्ल्यूसीएफ डुप्लेक्स सेवा के आसपास एक आवेदन है। मुझे समस्या है जब उपयोगकर्ता एप्लिकेशन को "पुनरारंभ" करता है ... हुड के नीचे, क्लाइंट पक्ष डब्ल्यूसीएफ सेवा से कनेक्शन बंद कर देता है और दूसरा बनाता है। सेवा अनुबंध इसलिए की तरह परिभाषित किया गया है ...डब्ल्यूसीएफ डुप्लेक्स सर्विस चैनल बंद
[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 चैनल को बंद करने में विफल हो सकता है समय: यह इस तरह दिखता है इस ऑपरेशन को आवंटित लंबे समय तक का एक हिस्सा हो सकता है। " कोई आंतरिक अपवाद नहीं है।
धन्यवाद
'ऑनक्लोस' ईवेंट हैंडलर जोड़ने का प्रयास करें। देखें कि ईवेंट को 'कॉलबैक' सर्वर पक्ष पर निकाल दिया गया है या नहीं। – mrtig
धन्यवाद, मैंने अभी कोशिश की है: समापन और बंद घटनाएं दोनों फायरिंग कर रहे हैं। – MrShoes
लेकिन सेवा अभी भी समय समाप्त हो रही है? क्या आपने बाध्यकारी पर 'CloseTimeout' सेट करने का प्रयास किया है? – mrtig