カテゴリー
C#

C# で HTTP GET を行う場合の例外処理

C# でHTTPを使ってサーバーからコンテンツを取得する際に起こり得る例外処理を調べて、catch で処理できるようコードを書いてみました。

HTTP ステータスコードの 401(未認証), 403(アクセス拒否) やネットワークケーブルを抜いた場合などは WebException でキャッチできるようです。

参考:
https://msdn.microsoft.com/ja-jp/library/system.net.webrequest(v=vs.80).aspx
https://msdn.microsoft.com/ja-jp/library/system.net.httpwebrequest.getresponse(v=vs.80).aspx
https://www.java2s.com/Code/CSharp/Network/Handlenetworkexceptions.htm
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

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

namespace webget
{
    class WebGet
    {
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("URL を指定してください。");
                return;
            }

            WebGet w = new WebGet();

            string s = w.HttpGet(args[0], "");
        }

        public string HttpGet(string URI, string Parameters)
        {
            string res = "";
            Stream dataStream = null;
            StreamReader reader = null;
            HttpWebResponse response = null;

            try
            {
                // URLの HTTP リクエストを作成. 		
                WebRequest request = WebRequest.Create(URI);

                // デフォルトのクレデンシャルを設定.
                request.Credentials = CredentialCache.DefaultCredentials;
                
                // HTTP レスポンスを取得.
                response = (HttpWebResponse)request.GetResponse();

                // ステータスの表示.
                Console.WriteLine(response.StatusDescription);
                
                // サーバーからコンテンツを含むストリームを取得.
                dataStream = response.GetResponseStream();
                
                // ストリームを開く
                reader = new StreamReader(dataStream);

                // コンテンツの読み込み.
                string responseFromServer = reader.ReadToEnd();

                // コンテンツの表示.
                Console.WriteLine(responseFromServer);
            }
            catch (WebException e)
            {
                // ネットワークが切断されているような場合 etc...
                Console.WriteLine("Web 例外 - " + e.Status + " : " + e.Message);
            }
            catch (UriFormatException e)
            {
                // https:///www.northwind.mydns.jp/samples のような場合
                //      ^^^
                Console.WriteLine("URI フォーマット不正: " + e.Message);
            }
            catch (System.Security.Authentication.AuthenticationException e)
            {
                Console.WriteLine("セキュリティ認証エラー: " + e.Message);
            }
            catch (InvalidOperationException e)
            {
                Console.WriteLine("無効な操作: " + e.Message);
            }
            catch (NotSupportedException e)
            {
                // htt:///www.northwind.mydns.jp/samples のような場合
                // ^^^
                Console.WriteLine("未サポートのプロトコル: " + e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("予期しないエラー: " + e.ToString());
            }
            finally
            {
                // Cleanup the streams and the response.
                if (reader != null)
                    reader.Close();
                if (dataStream != null)
                    dataStream.Close();
                if (response != null)
                    response.Close();
            }
            
            return res;
        }
    }
}