문제

예외가 발생하면 편안한 WCF 서비스에서 사용자 정의 상태 관리를 설정하고 있습니다. 그것은 실패 상태 코드를 얻은 이유에 대한 친근한 설명을 발신자에게 제공하기위한 것입니다.

다음은 피들러에서 볼 수있는 응답입니다. 그래서 나는 내 사용자 정의 메시지가 발신자에게 다시 밀려 나고 있다는 것을 알고 있습니다. 내가 알아낼 수없는 것은 .NET에서 해당 메시지를 검색하는 방법입니다. 상태 표시에는이 문자열이 포함되어 있지 않습니다.

당신이 좋은 약간의 샘플 코드를 제공 할 수 있다면.

HTTP/1.1 500 메시지 : "유형의 예외 예외 DatasourcenotfoundException '이 던져졌습니다." URI : http://www.test1.com/
내용 길이 : 0
서버 : Microsoft-HTTPAPI/2.0
날짜 : 월, 2009 년 4 월 20 일 07:13:40 GMT

업데이트
이 질문에 대한 답은 Silverlight에서는 작동하지 않습니다. Silverlight 2 및 3 베타에서 테스트되었습니다.

도움이 되었습니까?

해결책

.NET 프로그래머가 아니라 MSDN에서 이것을 발견했습니다

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}

다른 팁

나는 수년 동안 .NET을 사용하지 않았지만 Java에서는 자바에서 사람들은 종종 404 개의 오류에 대한 HTTP 코드와 메시지를받을 것으로 예상되는 반면, 404는 실제로 Java가 filenotfoundException을 던지게합니다. 그러한 상황에서는 Java에서 사용해야합니다 HttpURLConnection#getErrorStream 보다는 #getResponseMessage.

그렇다면 : 500 응답을 위해 .NET 클라이언트에서 비슷한 일이 발생합니까? 참으로 문서화 HttpWebRequest 상태 :

그만큼 httpwebrequest 클래스는 a WebException 리소스에 액세스하는 동안 오류가 발생하는 경우 그만큼 WebException.Status 속성에는 a가 포함됩니다 WebExceptionStatus 오류의 출처를 나타내는 값. 언제 WebException.Status ~이다 WebExceptionStatus.ProtocolerRor,, 응답 속성에는 httpwebresponse 리소스로부터받은.

세부 사항 : 링크 Response 위의 말을합니다 WebException.Response, 그렇지 않습니다 HttpWebRequest.GetResponse. 그래서, WebException 자체가 있습니다 Response 재산. 다음 예는 다음과 같습니다 WebException.Response 문서이지만 테스트하지 않았습니다.

중요 : 이것은 사용되지 않습니다 GetResponse ~에서 HttpWebRequest, 하지만 Response ~에서 WebException:

try {
  HttpWebRequest myHttpWebRequest = 
      (HttpWebRequest) WebRequest.Create("http://www.example.org/not_found");
  HttpWebResponse myHttpWebResponse =
      (HttpWebResponse) myHttpWebRequest.GetResponse();
  myHttpWebResponse.Close();
}
catch(WebException e) {
  Console.WriteLine("Exception Message: " + e.Message);
  if(e.Status == WebExceptionStatus.ProtocolError) {
    Console.WriteLine("Status Code: {0}",
        ((HttpWebResponse)e.Response).StatusCode);
    Console.WriteLine("Status Description: {0}",
        ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
  Console.WriteLine(e.Message);
}

귀하의 문제는 귀하의 상태 코드가 500이라고 생각합니다. 상태 코드가 괜찮지 않으면 (200 또는 일부 유형의 리디렉션), webRequest.getResponse () 호출은 .NET에서 WebException을 던졌습니다.

이 예외에는 실제로 상태 표시 세트가있는 httpwebresponse 객체가 포함됩니다. 아래 샘플은 MSDN에서 나온 것입니다.

public static void GetPage(String url) 
    {
        try 
           {    
                // Creates an HttpWebRequest for the specified URL. 
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
                // Sends the HttpWebRequest and waits for a response.
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
                if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
                   Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                        myHttpWebResponse.StatusDescription);
                // Releases the resources of the response.
                myHttpWebResponse.Close(); 

            } 
        catch(WebException e) 
           {
                Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
           }
        catch(Exception e)
        {
            Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
        }
    }

원천: http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode.aspx

실제로 상태를 얻으려면 예외 자체에서 httpwebrepresponse 객체를 가져와야합니다.

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

원천: http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx

복사/붙여 넣기인지 알 수는 없지만 "Uri :"헤더는 상태 코드와 같은 줄에 있습니다. 문제가 될 수 있습니다.

대부분의 이유 코드는 ":"및 인용문이없는 몇 단어입니다. http://tools.ietf.org/html/rfc2616#section-6.1.1 따라서 헤더 파서가 "메시지 :"HTTP 헤더의 시작이라고 생각합니다 (Webresponse.headers [ "Message"]).

대신 헤더 (예 : X-Error-Details)를 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top