HTTPのエラーレスポンスの取得

WebAPIやスクレイピングを行った際に、UploadStringやHTTPWebRequestで取得やプッシュを行っている。
この際、失敗した場合の処理でHTTPヘッダのステータスコードなどを取得する例は多いが、レスポンスのコンテント部分を取得する例があまり見当たらないため、ここにメモしておく。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //要求するURL(わざとエラーにするため、アプリケーションIDの後ろにKKを挿入)
            string url =  "http://shopping.yahooapis.jp/ShoppingWebService/V1/";
            string_url += "itemSearch?appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKK";
            string_url += "&query=%E8%AE%83%E5%B2%90%E3%81%86%E3%81%A9%E3%82%93";

            //WebRequestの作成
            System.Net.HttpWebRequest webreq =
                (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);

            System.Net.HttpWebResponse webres = null;
            try
            {
                //サーバーからの応答を受信するためのWebResponseを取得
                webres = (System.Net.HttpWebResponse)webreq.GetResponse();

                //応答したURIを表示する
                Console.WriteLine(webres.ResponseUri);
                //応答ステータスコードを表示する
                Console.WriteLine("{0}:{1}",
                    webres.StatusCode, webres.StatusDescription);
            }
            catch (System.Net.WebException ex)
            {
                //HTTPプロトコルエラーかどうか調べる
                if (ex.Status == System.Net.WebExceptionStatus.ProtocolError)
                {

                    System.Text.Encoding enc =
                        System.Text.Encoding.GetEncoding("shift_jis");

                    //HttpWebResponseを取得
                    System.Net.HttpWebResponse errres =
                        (System.Net.HttpWebResponse)ex.Response;

                    System.IO.Stream st = errres.GetResponseStream();
                    System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);
                    string return_str = sr.ReadToEnd();
                    //閉じる
                    sr.Close();
                    
                    
                    //応答したURIを表示する
                    Console.WriteLine(errres.ResponseUri);
                    //応答ステータスコードを表示する
                    Console.WriteLine("{0}:{1}",
                        errres.StatusCode, errres.StatusDescription);
                }
                else
                    Console.WriteLine(ex.Message);
            }
            finally
            {
                //閉じる
                if (webres != null)
                    webres.Close();
            }
        }
    }
}

例外で取得できたWebExceptionのResponseをHTTPWebResponseに変換し、
(System.Net.HttpWebResponse)ex.Response
さらに、そのオブジェクトからStreamオブジェクトを取得するためGetResponseStream()
errres.GetResponseStream()
でStreamを取得。後はStreamReaderにて取得する。

そもそもStreamが取得できなかった場合の処理が未記入のため、そのあたりは改変してください。