2010-03-25 12 views
8

से त्रुटि विवरण प्राप्त करना मेरे पास .NET WCF क्लाइंट द्वारा उपयोग की जाने वाली एक आरईएसटी सेवा है।डब्ल्यूसीएफ आरईएसटी

जब कोई त्रुटि आती है तो आरईएसटी सेवा जेएसओएन क्रमबद्ध विवरण वाले प्रतिक्रिया निकाय के साथ एक HTTP 400 खराब अनुरोध देता है।

यदि मैं फिडलर, जावास्क्रिप्ट या सी # से सीधे अनुरोध निष्पादित करता हूं तो त्रुटि होने पर प्रतिक्रिया निकाय आसानी से पहुंच सकता है।

हालांकि, मैं 6 काफी जटिल इंटरफेस के साथ एक डब्ल्यूसीएफ ChannelFactory का उपयोग कर रहा हूं। इस प्रॉक्सी द्वारा फेंक दिया गया अपवाद हमेशा उपयोगी जानकारी के साथ ProtocolException है।

क्या मुझे यह त्रुटि मिलने पर प्रतिक्रिया निकाय प्राप्त करने का कोई तरीका है?


अद्यतन

मुझे पता है इस नेट का उपयोग कर ऐसा करने के लिए अलग अलग तरीकों का भार देखते हैं और दूसरे तरीके भी त्रुटि प्रतिसाद मिल रहे हैं कि कि। वे जानना उपयोगी हैं लेकिन इस सवाल का जवाब न दें।

आरईएसटी सेवाओं का उपयोग हम बदल रहे हैं और जब वे जटिल इंटरफेस अपडेट करते हैं तो वे बदल जाएंगे। नए इंटरफेस के साथ ChannelFactory का उपयोग करना मतलब है कि हम संकलन समय (रन टाइम के बजाए) अपवाद प्राप्त करेंगे और कोड को बनाए रखने और अपडेट करने के लिए इन्हें बहुत आसान बना देंगे।

क्या डब्ल्यूसीएफ चैनलों का उपयोग करते समय त्रुटि स्थिति के लिए प्रतिक्रिया निकाय प्राप्त करने का कोई तरीका है?

+0

अपनी स्पष्टीकरण पढ़ना, ऐसा लगता है कि आपके पास आरईएसटी सेवा पर नियंत्रण नहीं है, क्या यह सही है? –

+0

दरअसल हम इस मामले में करते हैं, लेकिन इसे बदलना मुश्किल है। हमारी समस्या जटिलता है - डब्ल्यूसीएफ चैनल फैक्ट्री इंटरफेस के साथ इसे प्रबंधित करने का एक बहुत अच्छा तरीका देता है। कष्टप्रद बात यह है कि यह प्रतिक्रिया शरीर को फेंक देता है जब HTTP शीर्षलेख स्थिति 200 से अधिक कुछ होती है। जब हमें आरईएसटी सेवा से कोई त्रुटि मिलती है तो यह शरीर में विवरण के साथ एक HTTP 400 या 500 स्थिति देता है। – Keith

उत्तर

1

चैनलफ़ैक्टरी का उपयोग न करें :-) गंभीरता से हालांकि। आप एक आरईएसटी इंटरफेस क्यों बनायेंगे और फिर डब्ल्यूसीएफ क्लाइंट प्रॉक्सी का उपयोग करेंगे। आरईएसटी सेवा का उपयोग करने का क्या फायदा है? क्यों नहीं wsHttp बाइंडिंग का उपयोग करें? आरईएसटी स्टार्टर किट से एचटीपी क्लाइंट क्लास के साथ आप मानक HTTP अनुरोध कर सकते हैं और फिर DataContractSerializer का उपयोग करके प्रतिक्रिया को deserialize कर सकते हैं।

उदा।

var httpClient = new HttpClient(); 
var content = httpClient.Get("http://example.org/customer/45").Content; 
var customer = content.ReadAsDataContract<Customer>() 
+2

मुझे आपका सरल-बेहतर दृष्टिकोण पसंद है, लेकिन हमारे पास बड़ी संख्या में इंटरफेस हैं, और लगभग सभी विधियां जटिल पोस्ट सामग्री लेती हैं। 'चैनलफैक्टरी' के प्रॉक्सी कार्यान्वयन की कोड सादगी हमें कोड जटिलता का एक बहुत भयानक बचाती है। मुझे पता है कि यह आपके तरीके से किया जा सकता है, लेकिन मैं वास्तव में क्या जानना चाहता हूं: क्या हम त्रुटि विवरण प्राप्त कर सकते हैं यदि हम इसे 'चैनलफैक्टरी' तरीके से करते हैं? – Keith

3

आप सेवा से WebProtocolException फेंकने की कोशिश कर सकते। इस तरह त्रुटि विवरण HTTP प्रतिक्रिया के शरीर में शामिल किया जाना चाहिए। इस लेख पर एक नज़र डालें:

Effective Error Handling with WCF & REST

+0

यह वही है जो सेवा करता है - HTTP प्रतिक्रिया के शरीर में जेएसओएन क्रमबद्ध विवरण के रूप में विवरण। समस्या यह है कि चैनलफैक्टरी 200 से अधिक किसी भी HTTP शीर्षलेख स्थिति के लिए उन विवरणों के बिना अपवाद फेंकता है। सेवा काम करती है, यह डब्ल्यूसीएफ का क्लाइंट कार्यान्वयन है जो समस्या है। – Keith

1

मेरे दो सेंट कि WCF कई अलग अलग बाइंडिंग का उपयोग कर एक ही कक्षा उजागर पर अच्छा है। सी # के साथ संवाद करते समय, एक एसओएपी बाध्यकारी का उपयोग करें जो अपवाद जानकारी पर अच्छा है। यदि आपको आरईएसटी शैली बाध्यकारी का उपयोग करना होगा, तो आप सेवा को कॉल करने के लिए एक सरल वेबआरक्वेट का उपयोग कर सकते हैं और परिणामों को deserialize करने के लिए JSON serializer का उपयोग कर सकते हैं। यह आपको प्रतिक्रिया कोड तक सीधे पहुंच प्रदान करेगा।

4

आप नीचे के रूप में अपवाद विस्तार प्राप्त कर सकते हैं:

   Exception innerException = exception.InnerException; 
       WebException webException = innerException as WebException; 
       HttpWebResponse response = webException.Response as HttpWebResponse; 
       string statusDescription = response.StatusDescription; 
       HttpStatusCode statusCode = response.StatusCode; 
1

दृष्टिकोण user653761 द्वारा वर्णित मेरे लिए काम करता है; (अभी तक)

var serializer = new DataContractSerializer(typeof(MyDataContractType)); 
var deserialized = 
    (serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType); 

// ... 

मुझे लगता है कि यह कुछ भी है कि WCF को क्रमानुसार कर सकते हैं अगर आप सही serializer उपयोग करते हैं, प्रदर्शन के लिए परीक्षण नहीं किया था के लिए काम करेगा: HttpWebResponse वस्तु का उपयोग करने के बाद मैं DataContractSerializer वर्ग इस तरह उपयोग कर सकते हैं ।

3

ProtocolException के InnerExceptionWebException होगा। आप वास्तविक प्रतिक्रिया निकाय को पढ़ने के लिए HttpWebResponse प्राप्त कर सकते हैं और GetResponseStream पर कॉल कर सकते हैं। (पढ़ने से पहले स्ट्रीम की शुरुआत की तलाश करना याद रखें)।

var webException = (WebException) protocolException.InnerException; 
var response = (HttpWebResponse) webException.Response; 
var responseStream = response.GetResponseStream() 
responseStream.Seek(0, SeekOrigin.Begin); 
var reader = new StreamReader(responseStream); 
var responseContent = reader.ReadToEnd();