2010-07-14 13 views
5

क्या ग्राहक को 'गलती' वापस करने के लिए डब्ल्यूसीएफ सेवा प्राप्त करना संभव है? मुझे विश्वास है कि एसओएपी का उपयोग करते समय यह संभव है, लेकिन मैं जेएसओएन वापस लौटना चाहता हूं।जेएसओएन-स्वरूपित दोषों को वापस करने के लिए डब्ल्यूसीएफ सेवा

आदर्श रूप से, HTTP प्रतिक्रिया कोड इंगित करने के लिए कुछ सेट किया जाएगा कि एक त्रुटि हुई है, और फिर समस्या का विवरण JSON प्रतिक्रिया में उपलब्ध होगा।

वर्तमान में, मैं कुछ इस तरह कर रहा हूँ:

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    [FaultContract(typeof(TestFault))] 
    public MyResult MyMethod() 
    { 
     throw new FaultException<TestFault>(new TestFault("Message..."), "Reason..."); 
    } 
} 

कहाँ TestFault इस तरह दिखता है:

[DataContract] 
public class TestFault 
{ 
    public TestFault(string message) 
    { 
     this.Message = message; 
    } 

    [DataMember] 
    public string Message { get; set; } 
} 

पल में सेवा विन्यास में विशेष रूप से विशेष कुछ भी नहीं है।

इसका परिणाम एचटीएमएल-स्वरूपित त्रुटि के साथ '400 खराब अनुरोध' प्रतिक्रिया में होता है। (जब मैं includeExceptionDetailInFaults, मैं 'कारण ...' देख सकते हैं और FaultException का ब्यौरा, लेकिन TestFault पर कोई विवरण नहीं।)

वेब सेवा JSON ठीक है जब एक Exception (या FaultException) नहीं किया जा रहा है देता है फेंक दिया।

कोई सुझाव ..?

+0

अभी तक इस यहाँ http://iainjmitchell.com/blog/?p=142 –

उत्तर

7

संपादित करें: निश्चित लिंक + जोड़ा सारांश।

आप एक विवरण और एक समाधान here

, लिंक से समाधान संक्षेप में प्रस्तुत WebHttpBehavior का विस्तार करने और IErrorHandler का अपना स्वयं का कार्यान्वयन जोड़ने के लिए AddServerErrorHandlers ओवरराइड करने के लिए मिल सकता है। यह कार्यान्वयन सेवा कॉल से त्रुटि निकाल देगा और गलती जानकारी उत्पन्न करेगा।

लिंक किया गया लेख यह भी दिखाता है कि इस व्यवहार को सेट करने वाली अपनी सेवा होस्ट फैक्ट्री कैसे लिखनी है।

+0

धन्यवाद Timores को सुलझाने में एक और प्रयास। मैंने इस से काम किया लेकिन 'व्यवहार एक्सटेंशन एक्सटेंशन' सेट अप किया ताकि व्यवहार कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जा सके। –

+0

को वोट देना पड़ा, क्योंकि लिंक किया गया समाधान अब मौजूद नहीं है। – Andreas

+1

@ एंड्रियास, आप सही हैं। मैंने लिंक तय किया और इसकी सामग्री को सारांशित किया। – Timores

12

आपको जो कुछ चाहिए वह .NET 4 से शुरू हो सकता है। विवरण के लिए here देखें। उदाहरण के लिए:

throw new WebFaultException<string>(
    "My error description.", HttpStatusCode.BadRequest); 
+1

ऐसा लगता है कि यह काम कर सकता है, लेकिन असुरक्षित रूप से .NET 4 की आवश्यकता है, जिसे मैं इस मामले में उपयोग नहीं कर सकता। –

1

अपने jQuery.ajax() कॉल की त्रुटि कॉलबैक इस तरह दिखना चाहिए:

error: function (xhr, status, error) { 
    var responseObj = JSON.parse(xhr.responseText); 
    alert('Request failed with error: "' + responseObj.Message); 
} 

अपने WCF सेवा में, WebFaultException निर्माता के लिए एक अपवाद गुजरती हैं। आपका कस्टम संदेश के ऊपर जावास्क्रिप्ट में responseObj.Message के माध्यम से सुलभ हो जाएगा:

public class AJAXService : IAJAXService 
{ 
    public void SomeMethod() 
    { 
    throw new WebFaultException<Exception>(new Exception("some custom error message!"), HttpStatusCode.InternalServerError); 
    } 
} 
संबंधित मुद्दे