HttpWebRequest#GetRequestStreamで初回必ず例外
.NET 2.0環境、Windows Vista上でデバッグしていて気がついたのだが、イントラネット上のWebサーバに、表題のクラス#メソッドで接続しにいくと、必ず初回に例外が発生する。
"対象のコンピュータによって拒否されたため、接続できませんでした。 XXXX::XXXX:XXXX:XXXX:XXXX:ポート番号" (SocketErrorCode = System.Net.Sockets.SocketError.ConnectionRefused)
ローカル環境でテストしているので、試しに接続先を"localhost"に変更した所、
"対象のコンピュータによって拒否されたため、接続できませんでした。 ::1:ポート番号"
と表示されるので、どうやらIPv6での接続に失敗しているようだ。
ここまで見るとエラー処理で中断のはずだが、その後処理が継続しホストへの接続も完了しているようなので、実際にはIPv6接続 -> IPv4接続の順で試行し、その後は成功した方と接続を継続しているように見える。
処理が中断しないのは有り難いのだが、初回は必ず例外がスローされるため、精神的に気持ちが悪いことこの上ない。
追記
HttpWebRequest#ServicePoint#BindIPEndPointDelegateを使って、明示的に任意の(例えばIPv4限定とか)エンドポイントを解決できないか、調査中。
追記
以下のconfig記述によりDnsクラスからのIPcv6アドレスの解決を行わないようにできる、ということなので試してみたが、
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.net> <settings> <ipv6 enabled="false"/> </settings> </system.net> </configuration>
この設定を使っても、相変わらず接続の初回は
"対象のコンピュータによって拒否されたため、接続できませんでした。 ::1:ポート番号"
となってしまう。app.configに書いても駄目なのか? それとも.NET2.0だから?