2011-09-30 13 views
8

मैं अपने क्लाइंट-सर्वर एप्लिकेशन में डब्ल्यूसीएफ सेवा का उपयोग कर रहा हूं और सर्वर और क्लाइंट के बीच संचार करते समय मुझे निम्न त्रुटि का सामना करना पड़ रहा है।डब्ल्यूसीएफ सेवा चैनल में CommunicationObjectAbortedException जबकि एकाधिक डेटा लोड

Error Message =>> System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted. 

Server stack trace: 
    at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at ServiceLib.ServiceCallbackInterfaces.IHostServiceCallback.SendEventAndStatus(String message, Boolean isBackupGenerated) 
    at ServiceLib.Services.DriversService.objDriver_EventReceived(Object sender, EventReceivedEventArgs e) 

आवेदन परिदृश्य: ग्राहक WCF सेवा के माध्यम से सर्वर से डेटा हो रही है और बाध्यकारी nettcp उपयोग कर रहा है। सर्वर वास्तविक डिवाइस से जुड़ा हुआ है और हर सेकेंड में 20-30 घटनाएं उत्पन्न करता है। उत्पन्न घटनाओं को डब्ल्यूसीएफ के कॉलबैक इंटरफ़ेस का उपयोग करके सभी कनेक्टेड क्लाइंट्स को स्ट्रिंग संदेश के रूप में धक्का दिया जाता है। यह ठीक काम कर रहा है अगर ग्राहक के पास कोई प्रक्रिया लोड नहीं है (केवल ईवेंट और डिस्प्ले प्राप्त करें)। लेकिन जब हम क्लाइंट साइड पर कुछ लोडिंग प्रक्रिया करते हैं और कुछ समय के लिए व्यस्त होते हैं तो यह त्रुटि देता है।

नोट: मैंने पहले से ही nettcp बाध्यकारी में अधिकतम सभी टाइमआउट सेट कर दिए हैं, लेकिन फिर भी समस्या हल नहीं हुई है।

NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None); 
       tcpBinding.MaxBufferPoolSize = 2147483647; 
       tcpBinding.MaxReceivedMessageSize = 2147483647; 
       tcpBinding.MaxBufferSize = 2147483647; 
       tcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647; 
       tcpBinding.ReaderQuotas.MaxDepth = 2147483647; 
       tcpBinding.ReaderQuotas.MaxBytesPerRead = 2147483647; 
       tcpBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647; 
       tcpBinding.ReaderQuotas.MaxArrayLength = 2147483647; 
       tcpBinding.SendTimeout = TimeSpan.MaxValue; 
       tcpBinding.ReceiveTimeout = TimeSpan.MaxValue; 
       tcpBinding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue; 

कृपया मुझे मार्गदर्शन करें कि संचार चैनल या बाध्यकारी से संबंधित किसी भी अन्य सेटिंग्स की आवश्यकता है?

अद्यतन: त्रुटि एसवीसी ट्रेसर द्वारा फेंका:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
<EventID>131075</EventID> 
<Type>3</Type> 
<SubType Name="Error">0</SubType> 
<Level>2</Level> 
<TimeCreated SystemTime="2011-09-30T08:37:01.5691715Z" /> 
<Source Name="System.ServiceModel" /> 
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
<Execution ProcessName="ServerUtility" ProcessID="2396" ThreadID="5" /> 
<Channel /> 
<Computer>TEST</Computer> 
</System> 
<ApplicationData> 
<TraceData> 
<DataItem> 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
<TraceIdentifier>http://msdn.microsoft.com/it-IT/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier> 
<Description>Throwing an exception.</Description> 
<AppDomain>ServerUtility.exe</AppDomain> 
<Exception> 
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'.</Message> 
<StackTrace> 
at System.ServiceModel.Channels.SocketConnection.EndRead() 
at System.ServiceModel.Channels.DelegatingConnection.EndRead() 
at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state) 
at System.ServiceModel.Channels.SocketConnection.FinishRead() 
at System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead) 
at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 
<ExceptionString>System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'. ---&gt; System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host 
    --- End of inner exception stack trace ---</ExceptionString> 
<InnerException> 
<ExceptionType>System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>An existing connection was forcibly closed by the remote host</Message> 
<StackTrace> 
at System.ServiceModel.Channels.SocketConnection.EndRead() 
at System.ServiceModel.Channels.DelegatingConnection.EndRead() 
at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state) 
at System.ServiceModel.Channels.SocketConnection.FinishRead() 
at System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead) 
at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 
<ExceptionString>System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host</ExceptionString> 
<NativeErrorCode>2746</NativeErrorCode> 
</InnerException> 
</Exception> 
</TraceRecord> 
</DataItem> 
</TraceData> 
<System.Diagnostics xmlns="http://schemas.microsoft.com/2004/08/System.Diagnostics"> 
<LogicalOperationStack></LogicalOperationStack> 
<Timestamp>4730654290080</Timestamp> 
</System.Diagnostics> 
</ApplicationData> 
</E2ETraceEvent> 
+0

यह देखने के लिए जांचें कि क्या सेवा किसी भी अपवाद को फेंक रही है - अनचाहे अपवाद चैनल को गलती करेंगे; यह एक बाध्यकारी मुद्दा नहीं हो सकता है। – Tim

+1

क्या @ टिम ने कहा; ऐसा करने के लिए सर्विस ट्रेस व्यूअर का उपयोग करें, http://msdn.microsoft.com/en-us/library/ms732023.aspx –

+0

@ जेरेमीएमसीजी: मुझे सेवा ट्रेस व्यूअर का उपयोग करने के बारे में ज्यादा जानकारी नहीं है। क्या आप कृपया मुझे मार्गदर्शन कर सकते हैं? –

उत्तर

4

आप अपने प्रश्न में उल्लेख किया है, आप अधिकतम करने के लिए सभी समय समाप्ति निर्धारित किया है। तो मेरी राय के अनुसार, आपके द्वारा परिभाषित InstanceContextMode में समस्या होनी चाहिए। आपने अपनी सेवा में किस मोड को परिभाषित किया है? पर्सेशन, पर्कॉल या सिंगल। पर्कल हो सकता है जिसे आपने उसी ऑब्जेक्ट (सेवा की वैश्विक रूप से घोषित वस्तु) द्वारा परिभाषित और कॉलिंग सेवा हो सकती है, तो चैनल को गलती स्थिति या कनेक्शन डिस्कनेक्ट करने में संभव है।

तो यदि आपने पेरिसशन मोड को परिभाषित किया है तो सेवा से डेटा प्राप्त करने के लिए क्लाइंट पक्ष से एकल ऑब्जेक्ट (वैश्विक रूप से घोषित) का उपयोग करें। यदि आपने पेर्कॉल विकल्प को परिभाषित किया है तो हर बार नई वस्तु बनाएं।

आशा है कि यह आपकी मदद करेगा। कृपया किसी भी संदेह से पूछने में संकोच न करें ...

+0

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

+0

क्या आप कृपया वर्णन कर सकते हैं कि आप सभी ग्राहकों को ईवेंट अधिसूचना कैसे भेजते हैं? मेरा मतलब है कि आप इसके लिए कुछ कोड पोस्ट कर सकते हैं। एक और बात यह है कि जब आप ग्राहकों को ईवेंट अधिसूचना भेजते हैं, उस समय आप एक और सेवा कहते हैं जिसमें PerCall मोड है? – Chief

+0

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

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