2012-01-25 6 views
3

クライアントシステムにインストールするWindowsサービスを開発中です。このアプリケーションは、サーバー上のSOAP Webサービスを定期的に呼び出します。私たちは、トラブルシューティングの目的でサービスにアクセスするたびに、クライアントシステムのローカルIPアドレスをSOAP要求に含めることを望んでいます。ここでの他の記事を見て、私は、システム上のインターフェイスのためのIPアドレスのリストを取得するために、次のコードを見つけた:Windowsサービス内でWebサービスコールを行うためのインタフェースのローカルIPアドレスを取得する

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 

このコードは、Windowsサービスに含まれています。この配列内のどのIPがWebサービスコールのルーティング先のインターフェイスに割り当てられているかを簡単に判断する方法はありますか?

+0

実際には、ルーティングはリクエストの作成後に行われます。あなたができることは、リクエストが来たIPをサーバ側で捕捉することですが、ルーティング/ NATによっては、発信者のIPが表示されないことがあります。 – Joe

+0

@Joe、ありがとう。だから私は、サービスをヒットするHttpWebRequestオブジェクトを使用している場合は、要求を送信するインターフェイスのローカルIPを取得する方法はありません?ローカルIPは本当に私たちが望んでいるものです。これは実行可能な選択肢のように聞こえますか?ソケット・クラスを使用してエンドポイントに接続し、ソケットのLocalEndPointを取得しようとしました。これを行うことで間違ったIPを返す危険がありますか?私は、ソケット接続とサービスリクエストが必ずしも同じインターフェースを経由しないかもしれないと考えています。 – Poosh

答えて

1

あなたはWCF 3.5を使用しているか、後であなたが直接あなたにあなたのWindowsサービスに次のコードを実行することができ、このblog

+0

ありがとうございます。私は、クライアントがWCFサービスに当たっていないと言いました。リクエストが発信されているシステムのローカルIPを確実にロギングしたいので、ヒットしているサービス内のIPアドレスを取得する必要はありません。クライアント側で実行中の長期実行Windowsサービスでこれを判断する方法はありますか? – Poosh

0

のコードに示すように、メッセージのプロパティを使用して、サービスで、クライアントのIPアドレスを取得することができる場合ボックスの任意のインターフェイスのIPを取得します。

/// <summary> 
/// Returns the IP Address of the given interface 
/// </summary> 
/// <param name="InterfaceName">Name of the interface</param> 
/// <param name="AddressFamily">Address family to search for</param> 
/// <returns>IPAddress of assinged IP address</returns> 
public IPAddress GetIPAddress(string InterfaceName, System.Net.Sockets.AddressFamily AddressFamily) 
{ 
    System.Net.NetworkInformation.NetworkInterface Interface = GetInterface(InterfaceName); 
    if (Interface != null) 
    { 
     foreach (System.Net.NetworkInformation.UnicastIPAddressInformation IP in Interface.GetIPProperties().UnicastAddresses) 
     { 
      //Match address family 
      if(IP.Address.AddressFamily != AddressFamily) 
       continue; 

      //Check for IPv6 conditions since we can easily have multiple IPs 
      if(IP.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 && (IP.Address.IsIPv6LinkLocal || IP.AddressPreferredLifetime != uint.MaxValue || IP.AddressValidLifetime != uint.MaxValue)) 
       continue; 

      //We've found the IP 
      return IP.Address; 
     } 
    } 

    return null; 
} 

/// <summary> 
/// Returns the Network Interface for the given windows name 
/// </summary> 
/// <param name="InterfaceName">Interface name to get (ie Local Area Connection)</param> 
/// <returns>Network Interface, or null if not found</returns> 
System.Net.NetworkInformation.NetworkInterface GetInterface(string InterfaceName) 
{ 
    if (InterfaceName == null || InterfaceName.Length == 0) 
     return null; 

    foreach (System.Net.NetworkInformation.NetworkInterface Interface in NetworkInterfaceArray) 
    { 
     if (Interface.Name == InterfaceName) 
      return Interface; 
    } 

    return null; 
} 
+0

ありがとうございます。 Webサービスにヒットするために使用されているインタフェースを特定するために追加できる追加ロジックはありますか?私たちは、リクエストが発信された単一のローカルIPを取得したいと考えています。 – Poosh

0

アダプタが稼動していて、ループバックインターフェイスではない限り、実行されているマシン上のIPを含むリストを返します。

public static List<string> DisplayDnsAddresses() 
{ 
    var addresses = NetworkInterface.GetAllNetworkInterfaces() 
     .Where(a => a.OperationalStatus == OperationalStatus.Up 
        && a.NetworkInterfaceType != NetworkInterfaceType.Loopback) 
     .Select(a => a.GetIPProperties()) 
     .SelectMany(ipp => ipp.UnicastAddresses 
      .Select(x => x.Address.ToString())); 

    return addresses.ToList(); 
} 

これはおそらく少し洗練されている必要があります。私はwebserviceがどのインターフェースを使用するかを確実にする方法はわかりませんが、ネットワークに接続するために使用しなければならないゲートウェイを知っていれば、おそらくそれを固定することができます。

+0

提案をお寄せいただきありがとうございます。私は、それがWebサービスがどのインタフェースを使用しているかを判断する実行可能な方法であるかどうかを確認するために、もう少し検討します。 – Poosh

関連する問題