2013-11-01 2 views
0

웹 서버에 웹 요청을하기 위해 중고품 HttpClient (C#)를 사용하고 있습니다. 서버가 200 (또는 202 상상) 이외의 값을 반환하면 내 요청에서 TTransport 예외가 발생합니다.TTransport 예외에서 HTTP 상태 코드를 얻으려면 어떻게해야합니까?

반환되는 특정 상태 코드를 기반으로이 예외에 응답하고 싶습니다. 그러나 예외 인터페이스에서 상태 코드를 노출하는 것을 볼 수 없습니다. 내가 놓친 게 있니? 예외 메시지에 상태 코드가 포함되어 있음을 알고 있지만 상태 코드를 얻기 위해 해당 메시지를 구문 분석하지 않아도됩니다.

+0

재미있는 질문입니다. 일반적인 사용 사례는 기본 전송의 세부 사항을 추상화하여 교환 할 수 있도록하는 것입니다 (또는 유지하는 것이 좋습니다). 이것이 더러운 세부 사항이 TTransportException의보다 추상적 인 개념을 통해 반환되는 이유입니다. 귀하의 질문 뒤에있는 목적이 무엇인지 정확하게 물어보기를 바랍니다. – JensG

+0

404 오류가 발생하면 내 앱이 서버가 다운되었다고보고하고 서버가 백업 될 때까지 앱의 기능 중 아무 것도 작동하지 않는다고보고합니다. 500 오류가 발생하면 서버에 방금 발급 된 특정 명령을 처리하는 데 문제가 있음을보고하고자합니다. 사용자에게 표시하고있는 메시지에 자세한 내용이 필요하지 않으며 예외 메시지가 출력되기 때문에 오류 로그에 상태 코드가 포함되어 있으므로이 상태로 살 수 있습니다. 나는 방금 HTTPClient가 TTransport의 구현에 특정한 속성을 가질 것이라고 생각했다. – BobbyA

+0

'TransportException'의'Type' 필드를 확인하려고 했습니까? 404의 경우 이것은'EndOfFile'로 설정됩니다. 다른 오류가 발생하면 다른 오류가 발생합니다 (예 : 'Unknown '또는'TProtocolException'도 사용합니다. 최후의 수단은 메시지 텍스트에서 일부 키워드를 확인하는 것입니다.하지만 이는 다소 추한 것입니다. 위의 방법으로 문제를 해결할 수 있습니까? – JensG

답변

0

서버에서 처리 오류가 발생하면 HTTP 500을 보내지 않는 것이 좋습니다. 대신 서버에서 예외를 통해이를 알립니다. 다음의 Thrift IDL을 고려하십시오.

exception MyProcessingError 
{ 
    1: string reason 
    2: string errorDetails 
    3: string recommendedAction 
} 

service FooBar { 
    void ProcessPayments(1: double amount; 2: string receiver) 
    throws (1: MyProcessingError mpe) 
} 

args 및 struct 필드와 마찬가지로 여러 예외 유형을 선언 할 수 있습니다. 클라이언트는 보통 이러한 예외를 잡을 수 :

try 
{ 
    client.ProcessPayments(47.11, "Dagobert"); 
} 
catch (MyProcessingError e) 
{ 
    // process exception 
} 

  • 비고 서버는 특정 통화에 대한 IDL에 선언 된 예외를 던질 수 있습니다.
  • 또한 oneway 호출은 절대 값을 반환하지 않으므로 예외도 발생하지 않습니다.
관련 문제