क्या डब्ल्यूसीएफ पहली मौका अपवाद दबाता है?

I've got a WCF service that uses a LinqToSql DataContext to fetch some information out of a database. The return type of the operation is IEnumerable>, and I have a helper method that converts from the Table-derived LINQ object to a WCF data contract like so:

[OperationContract]
public IEnumerable RetrieveDomainObjects()
{
    var context = CreateDataContext();
    return from domainObject in context.DomainObjects
           select ConvertDomainObject(domainObject);
}

private DomainObjectDTO ConvertDomainObject(DomainObject obj)
{
   //etc...
}

This code exhibits a strange behaviour if I pass an invalid connection string to the DataContext. Being unable to find the correct database, presumably the above code throws a SqlException when enumerating the IEnumerable> when serialization is happening. However, when I run this code in my debugger, I see no first-chance exception on the server side at all! I told the debugger in the Exceptions tab to break on all thrown CLR exceptions, and it simply doesn't. I also don't see the characteristic "First chance exception" message in the Output window.

क्लाइंट साइड पर, मुझे "सॉकेट कनेक्शन अप्रत्याशित रूप से समाप्त" की रेखाओं के साथ एक त्रुटि संदेश के साथ एक संचार संदेश प्राप्त होता है। आंतरिक अपवादों में से कोई भी समस्या के अंतर्निहित कारण के रूप में कोई संकेत प्रदान करता है।

एकमात्र तरीका यह है कि मैं इसे समझ सकता था कि LINQ कोड को इस तरह से फिर से लिखना था कि क्वेरी अभिव्यक्ति का मूल्यांकन ऑपरेशन कंट्रैक्ट विधि के अंदर किया गया है। संयोग से, यदि कोई अनुमति समस्या है, तो मुझे एक ही परिणाम मिलते हैं, या यदि मैं डेटा कोंटेक्स्ट को किसी उपयोग कथन में लपेटता हूं, तो यह केवल SqlExceptions से अलग नहीं है।

Disregarding the inadvisability of making the return type an IEnumerable> and only enumerating the query somewhere in the depths of the serializer, is WCF suppressing or somehow preventing exceptions from being thrown in this case? And if so, why?

0

5 उत्तर

डब्ल्यूसीएफ दबाने या किसी भी तरह से इस मामले में अपवादों को फेंकने से रोक रहा है? और यदि हां, तो क्यों?

मुझे डब्ल्यूसीएफ के बारे में ज्यादा जानकारी नहीं है लेकिन यह मेरे लिए बहुत अधिक संभावना नहीं है।

पहली मौका अपवाद के बारे में विशेष बात यह है कि यह सीधे डीबगर पर जाता है और डीबगर को इसे पहले अपवाद वास्तव में उठाया जाने का मौका मिलता है - इसलिए शब्द 'पहला मौका' - डीबगर के पास है अपवाद को संभालने के लिए 'पहला मौका'। कुछ भी इसे कैसे बाईपास कर सकता है? अपवाद को पूरी तरह से उठाए जाने से रोकने का कोई तरीका होना चाहिए। (क्या सीएलआर में सुरक्षा या विश्वसनीयता सुविधाएं हैं जो यह कर सकती हैं?)।

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

0
जोड़ा

क्या आपने अपना " IncludeExceptionDetailInFaults को कॉन्फ़िगर किया था " सेटिंग्स? (यह सुरक्षा उद्देश्यों के लिए 'झूठी' पर डिफ़ॉल्ट है)।

0
जोड़ा

डब्ल्यूसीएफ एक उत्सुक जानवर है जो नियमित आईआईएस के बाहर थोड़ा रहता है; यह हो सकता है कि मानक डीबगिंग गड़बड़ हो जाए। हालांकि, आप डीबग अपवादों को सक्षम करने का प्रयास कर सकते हैं , और/या कार्यान्वित (और कॉन्फ़िगर) अपने स्वयं के मुद्दों को लॉग इन करने के लिए IErrorHandler

एक और विकल्प: क्या यहां शायद मिश्रण में एक इटरेटर ब्लॉक ( उपज वापसी ) है? एक इमेटरेटर ब्लॉक में कुछ भी नहीं का मूल्यांकन तब तक किया जाता है जब तक कि गणनाकर्ता को पुनरावृत्त नहीं किया जाता है, जिससे डेटा के साथ कुछ अजीब दिखने वाले मुद्दों का कारण बन सकता है जिसे पहले सत्यापित किया जाना चाहिए था। उपर्युक्त मामले में, यह कोई मुद्दा नहीं है (कोई उपज वापसी ), लेकिन यह देखना एक है।

उदाहरण के लिए, निम्नलिखित बहुत भिन्न है:

var context = CreateDataContext();
var query = from domainObject in context.DomainObjects
       select ConvertDomainObject(domainObject);
foreach(var item in query) { yield return item; }
0
जोड़ा

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

हम किसी अपवाद को भी पकड़ेंगे और उन्हें फॉल्टएक्सप्शन के रूप में फेंक देंगे, जैसे कुछ:

try
{
    DoSomething();
}
catch ( Exception ex )
{ 
   throw new FaultException( new CustomException( ex ), ex.Message );
}

जहां गलती अनुबंध में कस्टम अपवाद निर्दिष्ट किया गया है। ऐसा लगता है कि ग्राहक को अपवाद के बारे में थोड़ा और जानकारी दी गई है। इसलिए मुझे संदेह है कि क्या आप FQContract के हिस्से के रूप में SQLException जोड़ते हैं तो यह क्लाइंट को भेजा जाएगा।

0
जोड़ा

अपने क्लाइंट और सेवा के लिए App.config में निम्नलिखित डालने का प्रयास करें:



    
        
            
                
            
            
                
            
        
    


    
        
    

फिर सर्विस ट्रेस व्यूअर में परिणामी लॉग फ़ाइलों दोनों को लोड करें जो विंडोज एसडीके के साथ आता है। आप उस तरह से हटाए गए वास्तविक अपवाद को देख पाएंगे।

लिंक: http://msdn.microsoft.com/en-us/library/ aa751795.aspx

0
जोड़ा