はじめに
アプリケーションの改修作業をしていて、自PCでは動作していたが同僚のPCでは例外エラーが出て動作しなかった。
エラー名は憶えてないが、「cache\comm\fe80::6c2c:7539:7e8a:c350%11.xml」にはアクセスできない旨のエラーであった。
原因
キャッシュ用ファイルとしてIPv4のアドレスを想定してファイルを作成しようとしたところ、IPv6のアドレスとなり、ファイル名に使えない文字のコロン(:)が含まれているためエラーとなった。
プログラム上ではIPアドレスを取得する際に先頭アドレスを返すようになっていた、自PCではIPv4を優先にするようにしていたため、問題が発生しなかったが、同僚PCはIPv6が返された。
「IPv6無効設定」はもう古い?IPv6を有効にしたままIPv4の優先順位を上げる設定
対応
単純に先頭アドレスの取得ではなく、AddressFamily.InterNetworkの条件を入れてIPv4アドレスを返すように修正した。LINQを使ってシンプルに。
Get IPv4 addresses from Dns.GetHostEntry()
public static string GetIpAddress() {
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
return Convert.ToString(ipAddress);
}
別の対応としては、IPアドレスにIPv6を返ることも考慮して、ファイル名にする際にコロン(:)を除外してしまう。
cache\comm\fe806c2c75397e8ac350%11.xml
return GetIpAddress().Replace(":","") + ".xml";
パーセント(%)はファイル名としては使用できます。
ちなみに、IPv6の「%」の後の文字はインターフェイス識別子です。
最後に
IPv4アドレスを取得する方法は何番煎じのネタなので別に書かなくてもよかったのですが、別の切り口で書いてみれば、何か発見があるかなと思いました。