2012-05-03 20 views
5

मेरी समझ से निम्नलिखित ठीक से एक WCF बाकी सेवा से कस्टम त्रुटि फेंक देना चाहिए:WCF बाकी सेवा त्रुटि हैंडलिंग और WebChannelFactory

[DataContract(Namespace = "")] 
public class ErrorHandler 
{ 
    [DataMember] 
    public int errorCode { get; set; } 

    [DataMember] 
    public string errorMessage { get; set; } 
} // End of ErrorHandler 

public class Implementation : ISomeInterface 
{ 
    public string SomeMethod() 
    { 
     throw new WebFaultException<ErrorHandler>(new ErrorHandler() 
     { 
      errorCode = 5, 
      errorMessage = "Something failed" 
     }, System.Net.HttpStatusCode.BadRequest); 
    } 
} 

फ़िडलर में यह लगता है काम करने के लिए, मैं निम्नलिखित कच्चे डेटा प्राप्त करें:

HTTP/1.1 400 Bad Request 
Cache-Control: private 
Content-Length: 145 
Content-Type: application/xml; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
Set-Cookie: ASP.NET_SessionId=gwsy212sbjfxdfzslgyrmli1; path=/; HttpOnly 
X-Powered-By: ASP.NET 
Date: Thu, 03 May 2012 17:49:14 GMT 

<ErrorHandler xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><errorCode>5</errorCode><errorMessage>Something failed</errorMessage></ErrorHandler> 

लेकिन अब मेरे मुवक्किल की ओर मैं निम्नलिखित कोड है: अब

WebChannelFactory<ISomeInterface> client = new WebChannelFactory<ISomeInterface>(new Uri(targetHost)); 

ISomeInterface someInterface = client.CreateChannel(); 
try 
{ 
    var result = someInterface.SomeMethod(); 
} 
catch(Exception ex) 
{ 
    // Try to examine the ErrorHandler to get additional details. 
} 

जब कोड रन, यह पकड़ को हिट करता है और System.ServiceModel.ProtocolException संदेश के साथ 'रिमोट सर्वर ने एक अप्रत्याशित प्रतिक्रिया लौटा दी: (400) खराब अनुरोध।' ऐसा लगता है कि इस बिंदु पर ErrorHandler विवरण देखने का मेरा कोई तरीका नहीं है। क्या कोई इस में भाग गया है? क्या इस तरह से त्रुटिHander विवरण प्राप्त करने का कोई तरीका है?

उत्तर

4

WebChannelFactory या ChannelFactory केवल आपको सामान्य CommunicationException का खुलासा करेगा। आपको वास्तविक त्रुटि को वापस करने के लिए IClientMessageInspector व्यवहार का उपयोग करने की आवश्यकता होगी या WebRequest पर भरोसा करना होगा।

IClientMessageInspector दृष्टिकोण के लिए - this blog entry में टिप्पणियां देखें।

WebRequest दृष्टिकोण के लिए, आप WebException को पकड़ने के लिए निम्नलिखित अनुसरण कर सकते हैं।

try { } 
catch (Exception ex) 
{ 
    if (ex.GetType().IsAssignableFrom(typeof(WebException))) 
    { 
     WebException webEx = ex as WebException; 
     if (webEx.Status == WebExceptionStatus.ProtocolError) 
     { 
      using (StreamReader exResponseReader = new StreamReader(webEx.Response.GetResponseStream())) 
      { 
       string exceptionMessage = exResponseReader.ReadToEnd(); 
       Trace.TraceInformation("Internal Error: {0}", exceptionMessage); 
      } 
     } 
    } 
} 
संबंधित मुद्दे