C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

HttpClientにおいて、エラー発生 /kiku (25/06/18(Wed) 19:13) #103735
Re[1]: HttpClientにおいて、エラー発生 /kiku (25/06/19(Thu) 10:00) #103737 解決済み
│└ Re[2]: HttpClientにおいて、エラー発生 /KOZ (25/06/24(Tue) 01:09) #103741 解決済み
Re[1]: HttpClientにおいて、エラー発生 /WebSurfer (25/06/19(Thu) 09:57) #103736
  └ Re[2]: HttpClientにおいて、エラー発生 /kiku (25/06/19(Thu) 10:06) #103738
    └ Re[3]: HttpClientにおいて、エラー発生 /kiku (25/06/20(Fri) 18:23) #103740 解決済み


親記事 / ▼[ 103737 ] ▼[ 103736 ]
■103735 / 親階層)  HttpClientにおいて、エラー発生
□投稿者/ kiku (478回)-(2025/06/18(Wed) 19:13:42)

分類:[.NET 全般] 

2025/06/19(Thu) 08:28:30 編集(投稿者)
・環境
 .NETFrameWork4.8
 Win11(先日Win10からアップデート)
 WinFormアプリ
 C#

・ソースコード抜粋
   var _HttpClient = new HttpClient();
   var response = await _HttpClient.PostAsync(apiPath, content).ConfigureAwait(false);

・スタックトレース
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at LabelPrint.Web.HttpClientHolder.<HttpClientPostAsync>d__40.MoveNext() in ●●.cs:line 311

・例外内容
 エラーコード
  -2146233079
 エラー内容
  リモート名を解決できませんでした。: '●●'

解説
 上記の環境で、Azure上に構築されているWEBサービスに
 アクセスしています。
 Win10のときには、問題なくアクセスできていましたが、
 Win11にアップグレードした後から、高確率で上記エラーが発生します。
 ※アップグレードが原因かどうかは現在不明
 エラーになっても何回か実行していると、
 成功する場合もあります。

 Azure本番環境では、このようなエラーは発生していないことから
 Azure開発環境でのみ発生していると思います。

 上記タイムアウトを極端に大きく設定しても
 タイムアウト時間が経過する前にエラーが発生するため、
 接続する前にエラーになっていると思います。
 ※「リモート名を解決できませんでした。」と一致する。

 問題を切り分けるため、全く同じAPIを
 上記再現する同じPC上にあるChromeのTalendAPITesterを使い、
 実行しますと、100%成功することから
 Azure開発環境の問題ではないと思っています。

 また、同じWinFormアプリで何回か実行すると
 成功することから、アプリの問題ではないとも思っています。

 TalendAPITesterとWinFormアプリで
 名前解決の仕方が違うのではと思っています。
 また、Win11のアップグレードが問題になっていることも
 考えられるのではと思っています。
 原因は何が考えられるでしょうか?
 更に詳細に切り分けを行う手段はどのような手法がありますでしょうか?

 これ以上追及できずに困っています。
 アドバイスを頂きたいです。

 ==追記==
 別Win10にて、動作テストを実施したころ
 まったくエラー発生せず。
 Win10からWin11にアップグレードしたPCのみ発生している模様。


[ □ Tree ] 返信 編集キー/

▲[ 103735 ] / ▼[ 103741 ]
■103737 / 1階層)  Re[1]: HttpClientにおいて、エラー発生
□投稿者/ kiku (479回)-(2025/06/19(Thu) 10:00:12)
No103735 (kiku さん) に返信
> 2025/06/19(Thu) 08:28:30 編集(投稿者)

その後、AzureのAppServiceのスペックを
「BasicB1」から「Premium v3 P0V3」へスペックを上げたところ、
現象が発生しなくなりました。

サーバ側の問題だとした場合、
TalendAPITesterでは再現せず
WinFormアプリではなぜ再現するのであろうか疑問。
別PCのWin10でも再現しないのはなぜか疑問。

問題解決したことが事実なため、
解決済みにしますが、
もし、上記何かしら説明できるような知見が
ありましたら、教えて欲しいです。

解決済み
[ 親 103735 / □ Tree ] 返信 編集キー/

▲[ 103737 ] / 返信無し
■103741 / 2階層)  Re[2]: HttpClientにおいて、エラー発生
□投稿者/ KOZ (487回)-(2025/06/24(Tue) 01:09:39)
2025/06/24(Tue) 01:14:54 編集(投稿者)

No103737 (kiku さん) に返信
> TalendAPITesterでは再現せず
> WinFormアプリではなぜ再現するのであろうか疑問。

どれがどれを使っているかはわかりませんが、名前解決する APIは複数あるので違いが出ているのではないでしょうか、

DnsQuery_W 関数
https://learn.microsoft.com/ja-jp/windows/win32/api/windns/nf-windns-dnsquery_w

GetAddrInfoW 関数
https://learn.microsoft.com/ja-jp/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfow

gethostbyname 関数
https://learn.microsoft.com/ja-jp/windows/win32/api/winsock2/nf-winsock2-gethostbyname


解決済み
[ 親 103735 / □ Tree ] 返信 編集キー/

▲[ 103735 ] / ▼[ 103738 ]
■103736 / 1階層)  Re[1]: HttpClientにおいて、エラー発生
□投稿者/ WebSurfer (2957回)-(2025/06/19(Thu) 09:57:29)
No103735 (kiku さん) に返信

ハズレの可能性が高そうですが、エラーメッセージの、

> リモート名を解決できませんでした。: '●●'

から想像を膨らませて、名前解決の問題 ⇒ DNS の問題かもしれないということで
レスします。

Windows 10 では問題なく Windows 11 で問題が出るとか、短い期間で一日に数回
程度しか HttpClient は使わないであろう Windows Forms アプリで DNS の問題が
出るというのは考えにくいので、ハズレの可能性が高そうですが、ご参考まで。


HttpClient のインスタンスを生成すると、そのたびにソケットも生成されます。し
かし、HttpClient のインスタンスを Dispose してもソケットはクローズされない
ので、何度も繰り返すとソケットの枯渇につながるという問題がある・・・という
のはすでにご存じだと思います。

なので、それを避けるため、HttpClient のインスタンスはシングルトンにしてア
プリで使いまわすということを行っているのでないかと想像しています。

ただし、そうすると socket の枯渇の問題は解決できても、DNS の変更が反映され
ないという別の問題があるそうです。

ASP.NET など長時間実行されるプロセスで HttpClient の共有インスタンスを使用
する場合に、socket の枯渇と DNS の問題に対応するために、IHttpClientFactory
を使用するという方法があります。

IHttpClientFactory を使用して回復性のある HTTP 要求を実装する
https://learn.microsoft.com/ja-jp/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

Windows Forms アプリで DI を使って IHttpClientFactory を inject して使う
サンプルは以下の記事にありますので、興味があれば見てください。

Windows Forms で IHttpClientFactory 利用 (CORE)
https://surferonwww.info/blogengine/post/2021/03/12/how-to-use-ihttpclientfactory-in-windows-forms-application.aspx

上のサンプルのターゲットフレームワークは .NET 5.0 ですが、DI に使われて
いる Microsoft.Extensions.DependencyInjection 名前空間にあるクラス類は
.NET Framework でもバージョン 4.6.1 以降であれば利用できます。実装例は
以下の記事を見てください。

.NET Framework での Dependency Injection
https://surferonwww.info/blogengine/post/2023/04/13/dependency-injection-for-dotnet-framework-48-applicationaspx.aspx
[ 親 103735 / □ Tree ] 返信 編集キー/

▲[ 103736 ] / ▼[ 103740 ]
■103738 / 2階層)  Re[2]: HttpClientにおいて、エラー発生
□投稿者/ kiku (480回)-(2025/06/19(Thu) 10:06:09)
No103736 (WebSurfer さん) に返信
> ■No103735 (kiku さん) に返信

> なので、それを避けるため、HttpClient のインスタンスはシングルトンにしてア
> プリで使いまわすということを行っているのでないかと想像しています。
はい。シングルトンにしています。

> ただし、そうすると socket の枯渇の問題は解決できても、DNS の変更が反映され
> ないという別の問題があるそうです。
なるほど、確か以前調査して、そのような問題があることを
見聞きしたことを思い出しました。

> ASP.NET など長時間実行されるプロセスで HttpClient の共有インスタンスを使用
> する場合に、socket の枯渇と DNS の問題に対応するために、IHttpClientFactory
> を使用するという方法があります。
>
> IHttpClientFactory を使用して回復性のある HTTP 要求を実装する
> https://learn.microsoft.com/ja-jp/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
>
> Windows Forms アプリで DI を使って IHttpClientFactory を inject して使う
> サンプルは以下の記事にありますので、興味があれば見てください。
>
> Windows Forms で IHttpClientFactory 利用 (CORE)
> https://surferonwww.info/blogengine/post/2021/03/12/how-to-use-ihttpclientfactory-in-windows-forms-application.aspx
>
> 上のサンプルのターゲットフレームワークは .NET 5.0 ですが、DI に使われて
> いる Microsoft.Extensions.DependencyInjection 名前空間にあるクラス類は
> .NET Framework でもバージョン 4.6.1 以降であれば利用できます。実装例は
> 以下の記事を見てください。
>
> .NET Framework での Dependency Injection
> https://surferonwww.info/blogengine/post/2023/04/13/dependency-injection-for-dotnet-framework-48-applicationaspx.aspx
貴重な情報ありがとうございます。
参考にさせて頂きます。

[ 親 103735 / □ Tree ] 返信 編集キー/

▲[ 103738 ] / 返信無し
■103740 / 3階層)  Re[3]: HttpClientにおいて、エラー発生
□投稿者/ kiku (481回)-(2025/06/20(Fri) 18:23:22)
No103738 (kiku さん) に返信
> ■No103736 (WebSurfer さん) に返信
>>■No103735 (kiku さん) に返信
>>上のサンプルのターゲットフレームワークは .NET 5.0 ですが、DI に使われて
>>いる Microsoft.Extensions.DependencyInjection 名前空間にあるクラス類は
>>.NET Framework でもバージョン 4.6.1 以降であれば利用できます。実装例は
>>以下の記事を見てください。
>>
>>.NET Framework での Dependency Injection
>>https://surferonwww.info/blogengine/post/2023/04/13/dependency-injection-for-dotnet-framework-48-applicationaspx.aspx
> 貴重な情報ありがとうございます。
> 参考にさせて頂きます。

検証に時間がかかりそうなので(優先順位が下がった)、
一旦解決済みにします。
解決済み
[ 親 103735 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -