3

例外がスローされたときに、RESTful WCF サービスでカスタム StatusDescription を設定しています。これは、発信者がエラー ステータス コードを受け取った理由を分かりやすく説明するためのものです。

以下は、Fiddler で表示される応答です。したがって、カスタム メッセージが発信者にプッシュ バックされていることがわかります。私が理解できないのは、.NET からそのメッセージを取得する方法です。StatusDescription には、この文字列は含まれていません。

サンプルコードの簡単なビットを提供できれば、それは素晴らしいことです。

HTTP/1.1 500メッセージ: 「タイプ 'Exceptions.DataSourceNotFoundException' の例外がスローされました。」URI : http://www.test1.com/
Content-Length: 0
サーバー: Microsoft-HTTPAPI/2.0
日付: 2009 年 4 月 20 日月曜日 07:13:40 GMT

更新
この質問に対する答えは、Silverlight では機能しません。Silverlight 2 および 3 ベータ版でテスト済み。

4

4 に答える 4

4

.NET プログラマーではありません。msdn でこれを見つけました

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}
于 2009-04-29T06:39:14.240 に答える
3

私は何年も .NET を使用していませんが、Java では 404 Not Found エラーの HTTP コードとメッセージを受け取ることを期待することがよくありますが、404 は実際には Java に FileNotFoundException をスローさせます。そのような状況では、JavaHttpURLConnection#getErrorStreamでは#getResponseMessage.

では、.NET クライアントで 500 応答に対して同様のことが起こっているのではないでしょうか? 実際、州のドキュメント:HttpWebRequest

リソースへのアクセス中にエラーが発生すると、 HttpWebRequestクラスはWebExceptionをスローします。WebException.Statusプロパティには、エラーの原因を示す WebExceptionStatus 値が含まれていますWebException.StatusWebExceptionStatus.ProtocolErrorの場合、Responseプロパティにはリソースから受け取ったHttpWebResponseが含まれます。

詳細: 上記のリンクはではなく をResponse参照しています。したがって、独自のプロパティがあります。次の例はドキュメントに基づいていますが、テストはしていません。WebException.ResponseHttpWebRequest.GetResponseWebExceptionResponseWebException.Response

GetResponse重要: これはfromHttpWebRequestではなくResponsefrom を使用することに注意してください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);
}
于 2009-04-29T16:18:48.543 に答える
1

あなたの問題は、ステータス コードが 500 であることだと思います。ステータス コードが正常でない場合 (200 またはある種のリダイレクト)、WebRequest.GetResponse() 呼び出しは .NET で WebException をスローします。

この例外には、実際には StatusDescription が設定された 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

実際にステータスを取得するには、例外自体から HttpWebResponse オブジェクトを取得する必要があります。

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

于 2009-04-30T11:01:45.537 に答える
0

コピー/貼り付けかどうかはわかりませんが、「Uri:」ヘッダーがステータス コードと同じ行にあるため、問題になる可能性があります。

ほとんどの理由コードは、「:」と引用符のないいくつかの単語です: https://www.rfc-editor.org/rfc/rfc2616#section-6.1.1したがって、ヘッダーパーサーは「メッセージ:」と考えているのではないかと思います。 HTTP ヘッダーの開始です (webResponse.Headers["Message"] を確認してください)。

代わりにヘッダー (X-Error-Details など) を追加できます。

于 2009-05-02T09:26:01.350 に答える