web-dev-qa-db-ja.com

WebClient-エラーステータスコードで応答本文を取得します

私は本質的にここで尋ねられるのと同じことを探しています: サーバーがエラーを返したときにWebClientを使用して応答本文にアクセスする方法はありますか?

しかし、これまでのところ回答はありません。

サーバーは「400badrequest」ステータスを返しますが、応答本文として詳細なエラーの説明があります。

.NET WebClientを使用してそのデータにアクセスするためのアイデアはありますか?サーバーがエラーステータスコードを返すと、例外がスローされます。

15
SharpAffair

Webクライアントから取得することはできませんが、WebExceptionで、応答オブジェクトにアクセスして、それをHttpWebResponseオブジェクトにキャストすると、応答オブジェクト全体にアクセスできるようになります。

詳細については、 WebException クラス定義を参照してください。

以下はMSDNの例です(わかりやすくするためにWeb応答の内容を読んで追加しました)

using System;
using System.IO;
using System.Net;

public class Program
{
    public static void Main()
    {
        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 URL");

            // 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);
                using (StreamReader r = new StreamReader(((HttpWebResponse)e.Response).GetResponseStream()))
                {
                    Console.WriteLine("Content: {0}", r.ReadToEnd());
                }
            }
        }
        catch(Exception e) {
            Console.WriteLine(e.Message);
        }
    }
}
13
dmportella

次のように応答コンテンツを取得できます。

using (WebClient client = new WebClient())
{
    try
    {
        string data = client.DownloadString(
            "http://your-url.com");
        // successful...
    }
    catch (WebException ex)
    {
        // failed...
        using (StreamReader r = new StreamReader(
            ex.Response.GetResponseStream()))
        {
            string responseContent = r.ReadToEnd();
            // ... do whatever ...
        }
    }
}

テスト済み:.Net4.5.2で

8
Chris Ruck