.Net HttpWebRequest.GetResponse() は、http ステータス コード 400 (不正な要求) が返されると例外を発生させます。質問する

.Net HttpWebRequest.GetResponse() は、http ステータス コード 400 (不正な要求) が返されると例外を発生させます。質問する

サーバーから HTTP 400 コードを受け取った場合、サーバーがリクエストの何が問題だったかを知らせる完全に合法的な方法である状況です (HTTP 応答コンテンツ内のメッセージを使用して)

ただし、ステータス コードが 400 の場合、.NET HttpWebRequest では例外が発生します。

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

ベストアンサー1

「成功しなかった場合にコードをスローする」をオフにする方法があれば便利ですが、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)
            {
                // TODO: Handle response being null
                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);
                }
            }
        }
    }
}

「成功コードでない場合でも応答を取得する」部分を別のメソッドにカプセル化することをお勧めします。(応答がない場合、たとえば接続できなかった場合は、引き続きスローすることをお勧めします。)

エラー応答が大きい場合 (これは異常です)、HttpWebRequest.DefaultMaximumErrorResponseLengthエラー全体が確実に取得されるように調整することをお勧めします。

おすすめ記事