1. ホーム
  2. .net

[解決済み】.Net HttpWebRequest.GetResponse() で http ステータスコード 400 (bad request) が返されると例外が発生する。

2022-04-07 23:03:19

質問

サーバーからHTTP 400コードを受け取ったとき、それは私のリクエストに何が問題だったのかを伝えるための完全に合法的な方法です(HTTPレスポンスのコンテンツにメッセージを使用)。

しかし、.NET HttpWebRequestは、ステータスコードが400の場合、例外を発生させます。

これはどのように処理すればよいのでしょうか?私にとっては、400は完全に合法であり、むしろ有用です。HTTPのコンテンツには重要な情報が含まれていますが、例外が発生すると、私は道を踏み外してしまいます。

解決方法は?

throw on non-success code"をオフにする方法があればいいのですが、WebExceptionをキャッチすれば、少なくともレスポンスを使用することは可能です。

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

public class Test
{
    static void Main()
    {
        WebRequest request = WebRequest.Create("http://csharpindepth.com/asd");
        try
        {
            using (WebResponse response = request.GetResponse())
            {
                Console.WriteLine("Won't get here");
            }
        }
        catch (WebException e)
        {
            using (WebResponse response = e.Response)
            {
                HttpWebResponse httpResponse = (HttpWebResponse) response;
                Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                using (Stream data = response.GetResponseStream())
                using (var reader = new StreamReader(data))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
            }
        }
    }
}

成功コードでなくてもレスポンスを取得する」部分を別のメソッドでカプセル化するとよいでしょう。(接続できなかった場合など、レスポンスがない場合でもthrowすることをお勧めします)。

エラーレスポンスが大きくなる可能性がある場合(これは珍しいことです)には、以下のように調整するとよいでしょう。 HttpWebRequest.DefaultMaximumErrorResponseLength を使用して、エラー全体を取得するようにします。