2009-05-08 2 views
1

[WebGet] 속성을 사용하여 웹 서버의 REST API를 쿼리하고 있습니다. 모든 경우에 (API가 아직 개발 중이므로) 필자는 원하는 XML 대신 HTTP/500 오류 형식으로 HTML 문서를 가져옵니다. 여기 WCF의 WebGet 속성을 사용할 때 HTTP 오류를 어떻게 catch합니까?

내 작업 계약의 예 :

[WebGet(UriTemplate = "search/?api_key={key}&query={query}", 
    BodyStyle = WebMessageBodyStyle.Bare)] 
[OperationContract] 
XElement Find(string key, string query); 

... 그리고 여기에 내가 전화하는 방법은 다음과 같습니다 에러가 발생

var factory = new WebChannelFactory<IFooFinder>(
    new Uri("http://api.example.com")); 
var channel = factory.CreateChannel(); 
var results = channel.Find(myApiKey, "foo"); 

를, "결과"는 인 끝 이 XML이 포함 된 XElement :

<html> 
    <head></head> 
    <body> 
     500 Internal Server Error 
    </body> 
</html> 

XML이 반환되기 전에 500 오류를 잡을 수있는 방법이 있습니까? 채널에 예외가 발생 했습니까? 아니면 매번 결과 변수를 검사하여 예상되는 XML이 있는지 확인해야합니까?

답변

3

아니요, 실제로 HTTP 만 있으면 예외 또는 SOAP 오류가 발생하지 않습니다. 따라서 서비스가 실패 할 경우 HTTP 클라이언트에 다시 전달할 수있는 유일한 방법은 HTTP 상태 코드를 사용하는 것입니다.

코드를 더 의미있는 것으로 만들 수 있습니다 (예 : 항상 500을 반환하지는 않겠지 만 좀 더 세부적으로 나눕니다. 또는 무엇이 잘못되었는지 힌트를주기 위해 더 많은 설명적인 오류 메시지를 포함 할 수 있습니다 (적어도 개발 및 테스트 용).

하지만 기본 메커니즘은 GET에 HTTP 만 사용하고 상태 및 오류 코드를 반환하는 HTTP 만 있습니다.

마크

+0

Marc. 모욕을 가하기 위해, 내가 말하는 REST API는 오류가있을 때 실제로 200/OK를 반환하고 HTML의 오류 메시지 만 제공한다고 생각합니다. 자세한 내용은 해당 담당자에게 문의해야합니다. –

2

오류 코드 서버의 상태 코드를 설정하면 그때는 클라이언트가 예외에 그지도를 기대. System.Net.HttpWebRequest가 400 또는 500 계열의 상태 코드를 얻으면 클라이언트에서 WebException을 throw합니다.

서버 측에서는 모든 서비스 구현 방법에서 try catch 블록을 추가하지 않으려는 경우 System.ServiceModel.Web에서 제공하는 표준 오류 처리기를 교체해야합니다.

새로운 파생 WebHttpBehaviour를 만들고 AddServerErrorHandlers를 오버로드하여 기본 오류 처리기가 적용되지 않도록하는 코드가 있습니다. 그런 다음 IServiceBehavior를 구현하는 새로운 비헤이비어에서 ApplyDispatchBehavior를 사용하여 상태 코드를 설정하는 오류 처리기를 추가해야합니다.

아마도 더 쉬운 방법 일 것입니다. WCF에서 같은 고양이를 가죽 벗기는 1001 가지 방법이있는 것 같습니다.

+0

안녕 Darrel. 이 경우 서버에 대한 제어권이 없습니다. 제 3 자 웹 사이트입니다. 그래도 고마워. +1 –

관련 문제