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

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

新規登録して質問してみよう
ただいま回答率
85.49%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

Q&A

解決済

1回答

9886閲覧

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

yonotsui

総合スコア28

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

0グッド

0クリップ

投稿2020/02/27 15:24

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

C#

1 public static async void Test() 2 { 3#if true //プロキシを使用する場合 4 //IPからホスト名を取得 5 var ip = "51.158.67.190"; 6 var port = 8118; 7 var host = Dns.GetHostEntry(ip)?.HostName; 8 if (String.IsNullOrEmpty(host)) 9 { 10 return; 11 } 12 13 //ホストとポートでプロキシ作成 14 var proxyCore = new WebProxy(host, port); 15 bool useProxy = true; 16#else //プロキシを使用しない場合 17 WebProxy proxyCore = null; 18 bool useProxy = false; 19#endif 20 //ハンドラー作成 21 var hc = new HttpClientHandler() 22 { 23 Proxy = proxyCore, 24 UseProxy = useProxy, 25 PreAuthenticate = false, 26 UseDefaultCredentials = false, 27 UseCookies = true, 28 CookieContainer = new CookieContainer(), 29 }; 30 31 //クライアント作成 32 var httpClient = new HttpClient(hc); 33 34 //chrome上でアクセスするときと同じ情報をヘッダーに設定 35 String url = "https://www.yahoo.co.jp/"; 36 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"); 37 httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br"); 38 httpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("ja,en-US;q=0.9,en;q=0.8"); 39 httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true }; 40 httpClient.DefaultRequestHeaders.Add("pragma", "no-cache"); 41 httpClient.DefaultRequestHeaders.Add("sec-fetch-mode", "navigate"); 42 httpClient.DefaultRequestHeaders.Add("sec-fetch-site", "none"); 43 httpClient.DefaultRequestHeaders.Add("upgrade-insecure-requests", "1"); 44 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"); 45 46 using (var req = new System.Net.Http.HttpRequestMessage(HttpMethod.Get, url)) 47 { 48 try 49 { 50 using (var response = await httpClient.SendAsync(req)) 51 { 52 if (response.StatusCode == System.Net.HttpStatusCode.OK) 53 { 54 //gzipでの読み込み 55 using (Stream stream = await response.Content.ReadAsStreamAsync()) 56 using (Stream decompressed = new GZipStream(stream, CompressionMode.Decompress)) 57 using (StreamReader reader = new StreamReader(decompressed)) 58 { 59 var ret = reader.ReadToEnd(); 60 } 61 } 62 } 63 } 64 catch (Exception ex) 65 { 66 Console.WriteLine(ex); 67 } 68 } 69 }
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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

C#

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

投稿2020/02/27 23:23

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/27 23:40

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

退会済みユーザー

2020/02/27 23:53 編集

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

2020/02/28 13:30

>そのままipアドレスで接続すればいいと思います。 webproxyの設定にはipは渡せません。 念のために試しましたがやはりだめでした。 >正引できないんじゃなく rfc規約違反で登録されているサブドメインだからチェックせずにエラーとしているはず(笑) いくつかのプロキシをためしたら教えていただいた命名規則に近いホスト名のプロキシだけ使えたので、 おっしゃる通りrfc規約違反のためだと思います。 命名規則はまだ細かくはわかりませんが、使用できるものだけフィルタリングして運用してみます。 お二人ともありがとうございました。
Y.H.

2020/03/02 06:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問