質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

認証なしプロキシを使用したWebProxyでHttpClientを使用するとリモート名が解決できない例外が起きる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,271

score 25

フリーの認証なしプロキシを使用したHttpClientのテストをしていたのですが正常に動作せず、
かならずリモート名が解決できない(NameResolutionFailure)でクラッシュします。
いくつかのサイトで試しましたがいずれも同じ結果でした。
いずれのサイトもプロキシを使用している・していないケースで試したのでプロキシが原因なのは間違いがありません。
必要な設定はできているはずですが、何が間違っているのでしょうか?
ご教示いただけますと幸いです。

        public static async void Test()
        {
#if true    //プロキシを使用する場合
            //IPからホスト名を取得
            var ip = "51.158.67.190";
            var port = 8118;
            var host = Dns.GetHostEntry(ip)?.HostName;
            if (String.IsNullOrEmpty(host))
            {
                return;
            }

            //ホストとポートでプロキシ作成
            var proxyCore = new WebProxy(host, port);
            bool useProxy = true;
#else       //プロキシを使用しない場合
            WebProxy proxyCore = null;
            bool useProxy = false;
#endif
            //ハンドラー作成
            var hc = new HttpClientHandler()
            {
                Proxy = proxyCore,
                UseProxy = useProxy,
                PreAuthenticate = false,
                UseDefaultCredentials = false,
                UseCookies = true,
                CookieContainer = new CookieContainer(),
            };

            //クライアント作成
            var httpClient = new HttpClient(hc);

            //chrome上でアクセスするときと同じ情報をヘッダーに設定
            String url = "https://www.yahoo.co.jp/";
            httpClient.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
            httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");
            httpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("ja,en-US;q=0.9,en;q=0.8");
            httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };
            httpClient.DefaultRequestHeaders.Add("pragma", "no-cache");
            httpClient.DefaultRequestHeaders.Add("sec-fetch-mode", "navigate");
            httpClient.DefaultRequestHeaders.Add("sec-fetch-site", "none");
            httpClient.DefaultRequestHeaders.Add("upgrade-insecure-requests", "1");
            httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36");

            using (var req = new System.Net.Http.HttpRequestMessage(HttpMethod.Get, url))
            {
                try
                {
                    using (var response = await httpClient.SendAsync(req))
                    {
                        if (response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                            //gzipでの読み込み
                            using (Stream stream = await response.Content.ReadAsStreamAsync())
                            using (Stream decompressed = new GZipStream(stream, CompressionMode.Decompress))
                            using (StreamReader reader = new StreamReader(decompressed))
                            {
                                var ret = reader.ReadToEnd();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: リモート名を解決できませんでした。: '190-67-158-51.rev.cloud.scaleway.com'
   場所 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   場所 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
   --- 内部例外スタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   場所 FlowLib.HttpEx.HttpUtil.<Test>d__9.MoveNext() 場所 F:\プロ・Oラム\FW\FlowLib\HttpEx\HttpUtil.cs:行 237
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

なぜわざわざhost名でproxyサーバーに接続しようとしているのでしょうか?
実行している環境に設定しているDNSサーバーで190-67-158-51.rev.cloud.scaleway.comが正引できないだけだと思います。

そのままipアドレスで接続すればいいと思います。

//var proxyCore = new WebProxy(host, port);
var proxyCore = new WebProxy(ip, port);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/28 08:40

    正引できないんじゃなく rfc規約違反で登録されているサブドメインだからチェックせずにエラーとしているはず(笑)

    キャンセル

  • 2020/02/28 08:45 編集

    /[a-z][0-9a-z(利用可能な記号:忘れた)]+/i
    上記がドメインの各セグメント(サブドメイン/今回はtld以外を指す)

    キャンセル

  • 2020/02/28 22:30

    >そのままipアドレスで接続すればいいと思います。
    webproxyの設定にはipは渡せません。
    念のために試しましたがやはりだめでした。

    >正引できないんじゃなく rfc規約違反で登録されているサブドメインだからチェックせずにエラーとしているはず(笑)
    いくつかのプロキシをためしたら教えていただいた命名規則に近いホスト名のプロキシだけ使えたので、
    おっしゃる通りrfc規約違反のためだと思います。
    命名規則はまだ細かくはわかりませんが、使用できるものだけフィルタリングして運用してみます。

    お二人ともありがとうございました。

    キャンセル

  • 2020/03/02 15:35

    var proxyCore = new WebProxy(new Uri(string.Format("http://{0}:{1}", ip, port)));
    でとおりませんかね?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • 認証なしプロキシを使用したWebProxyでHttpClientを使用するとリモート名が解決できない例外が起きる