2012-05-03 41 views
5

Z mojego zrozumienia następujące powinny prawidłowo rzucać niestandardowego błędu z usługi WCF Rest:WCF Rest obsługa błędów service & 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); 
    } 
} 

W Skrzypek to wydaje się działać, mam następujące dane surowe:

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> 

Ale teraz na mojej stronie klienta mam następujący kod:

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. 
} 

teraz, gdy kod uruchamia się, trafia w połówkę i jest System.ServiceModel.ProtocolException z komunikatem "Serwer zdalny zwrócił nieoczekiwaną odpowiedź: (400) Złe żądanie.". Wygląda na to, że nie mam możliwości zobaczenia szczegółów ErrorHandler w tym momencie. Czy ktoś w to wjechał? Czy istnieje sposób, w jaki mogę uzyskać informacje o błędzie ErrorHander w tym momencie?

Odpowiedz

4

WebChannelFactory lub ChannelFactory ujawni ci tylko ogólne CommunicationException. Będziesz musiał użyć zachowania IClientMessageInspector lub polegać na WebRequest, aby zwrócić rzeczywisty błąd.

Dla podejścia IClientMessageInspector - patrz komentarze w this blog entry.

Dla podejścia WebRequest można wykonać następujące czynności, aby przechwycić numer 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); 
      } 
     } 
    } 
}