2011-03-30 13 views
6

मैं विजुअल स्टूडियो के साथ बनाई गई डब्ल्यूसीएफ सेवा का उपयोग कर रहा हूं।मोनोटच: डब्ल्यूसीएफ सेवाएं और अपवाद हैंडलिंग

मैं डेटा पुनर्प्राप्त करने के लिए GetDataAsync (param) जैसे कॉल कर रहा हूं। GetData पूर्ण हैंडलर में, मैं पुनर्प्राप्त डेटा का उपयोग कर रहा हूं।

सेवा काम करता है। कभी-कभी मैं डेटा पुनर्प्राप्त नहीं कर सकता। इस मामले में, एक अपवाद निम्न जैसा हुआ:

Exception in async operation: System.Net.ProtocolViolationException: The number of bytes to be written is greater than the specified ContentLength. 
    at System.Net.WebConnectionStream.CheckWriteOverflow (Int64 contentLength, Int64 totalWritten, Int64 size) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnectionStream.cs:546 

समान उत्साह को पकड़ना कैसा संभव है? एप्लिकेशन अभी भी काम कर रहा है लेकिन अपवाद को कंसोल पर मुद्रित किया गया है। मुझे लगता है कि चैनल से अपवाद के नाम या कुछ और।

अग्रिम धन्यवाद।

+0

अरे, क्या आपने इसे समझ लिया है?मेरे पास अपाचे पर mod_mono के साथ चल रहे HttpWebRequest, WebRequest, और WebClient क्लासेस दोनों के साथ मोनो फ्रेमवर्क पर समकक्ष समस्या है। समस्या तब होती है जब http अनुरोध में एक शरीर होता है (यदि शरीर खाली नहीं है और सामग्री लम्बाई 0 है)। सर्वर पुनरारंभ करने के बाद पहला अनुरोध हमेशा सफल होता है, लेकिन बाद के सभी अनुरोध असफल होते हैं और आपके द्वारा वर्णित त्रुटि लौटाते हैं। यदि आपकी कोई जानकारी है तो कृपया मदद करें :-) ब्र। मोर्टन – Maate

+1

मोनो टच का किस संस्करण का उपयोग किया जा रहा है? उपर्युक्त संदेश ** "एसिंक ऑपरेशन में अपवाद" ** केवल ** MOONLIGHT ** प्रोफ़ाइल के अंदर पाया जाता है, इसलिए इसे * कंसोल * पर कुछ भी प्रिंट नहीं करना चाहिए। – poupou

उत्तर

2

दुर्भाग्य से वर्तमान में इन डब्ल्यूसीएफ अपवादों को मोनोटच में पकड़ा नहीं जा सकता है। यह एक ज्ञात बग प्रतीत होता है। MonoTouch - WCF Services made by Silverlight tool - Can't catch exceptions

+0

हम्म .. मुझे लगता है कि यह सवाल का जवाब देता है, इसलिए बक्षीस। हालांकि मेरी वास्तविक समस्या ओपी की समस्या का उप-भाग है जो बताती है कि यह प्रोटोकॉल अपवाद यादृच्छिक रूप से होता है। यह वेब क्लाइंट क्लास के साथ और (एचटीपी) वेबरक्वेट कक्षाओं के साथ ऐसा करता है। इसलिए, मूल रूप से मुझे परवाह नहीं है कि मैं इसे पकड़ सकता हूं या नहीं - मैं नहीं चाहता कि यह बिल्कुल हो। मैंने इसे System.Net.TcpClient के शीर्ष पर सीधे एक साधारण HTTP क्लाइंट लिखकर हल किया। यह सुंदर नहीं है, लेकिन यह स्थिर प्रतीत होता है और सामान्य बग तय होने तक मेरे लिए काम करेगा। – Maate

0

डब्ल्यूसीएफ का उपयोग करते समय जितना संभव हो उतना दृश्यता प्राप्त करने का प्रयास करने के लिए हमेशा अच्छा होता है। दो उपकरण हैं जिनका मैं अक्सर उपयोग करता हूं। वे WCF ट्रेस व्यूअर और WCF कॉन्फिग संपादक

  • SvcConfigEditor.exe
  • SvcTraceViewer.exe

निर्भर करता है अगर आप एक x64 या X84 मशीन और उन्हें होना चाहिए नेट के संस्करण के हैं या तो स्थित है।

  • C: \ \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ बिन
  • C: \ \
  • सी प्रोग्राम फ़ाइलें \ Microsoft SDKs \ Windows \ v7.0A \ बिन: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v6.0A \ बिन
  • C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ बिन की जाँच करें

बाहर चेक http://merbla.blogspot.com/2009/02/wcf-tools.html

2

आप आर सवाल है:

समान (लाल: प्रोटोकॉल उल्लंघन) अपवाद को पकड़ना कैसा संभव है?

आपकी सेवा आवेदन में, निम्न कोड के साथ ProtocolViolationException पकड़ने:

catch (ProtocolViolationException ex) 
{ 
    // do something with your exception here 
    // for example, throw a FaultException that will be communicated to the client 
    throw new FaultException<ProtocolViolationException> 
     (ex, new FaultReason(ex.Message), new FaultCode("Sender")); 
} 

इसके लिए सही ढंग से ग्राहक को वापस भेजने के लिए, आपको संचालन पर एक अतिरिक्त विशेषता स्थापित करने के लिए की आवश्यकता होगी अनुबंध, जैसे:

[OperationContract()] 
[FaultContract(typeof(ProtocolViolationException))] 

और फिर, क्लाइंट की तरफ आप इस विशिष्ट अपवाद की आशा है और यह शान से संभाल, जैसे कर सकते हैं:

catch (FaultException<ProtocolViolationException> ex) 
{ 
    Console.WriteLine("FaultException<>: " + ex.Detail.GetType().Name + " - " + ex.Detail.Message); 
} 

क्या यह आपके प्रश्न का उत्तर देता है?

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