2012-05-03 3 views
5

제대로 WCF REST 서비스에서 사용자 지정 오류가 발생합니다 다음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. 
} 

을 코드 실행되면 catch에 도달하고 '원격 서버에서 예기치 않은 응답을 반환했습니다 : (400) Bad Request.'라는 메시지가있는 System.ServiceModel.ProtocolException입니다. 이 시점에서 ErrorHandler 세부 정보를 볼 방법이없는 것 같습니다. 아무도 이것에 빠지지 않았나요? 이 시점에서 ErrorHander 세부 정보를 얻을 수있는 방법이 있습니까?

답변

4

또는 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); 
      } 
     } 
    } 
}