2

このコードを使用してパブリックIPアドレスを取得します(この投稿のおかげで、C#アプリケーションが実行されているサーバーのIPアドレスを取得する方法は?):

    public static string GetPublicIP()
    {
        try
        {
            String direction = "";
            WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                {
                    direction = stream.ReadToEnd();
                }
            }

            //Search for the ip in the html
            int first = direction.IndexOf("Address: ") + 9;
            int last = direction.LastIndexOf("</body>");
            direction = direction.Substring(first, last - first);

            return direction;
        }
        catch (Exception ex)
        {
            return "127.0.0.1";
        }
    }

しかし、誰が私のWebサイトにアクセスしても、それらはすべて同じIPを取得します。これは、サーバーのパブリックIPであり、現在のユーザーのIPではありません。

サーバーとしてではなく、現在のユーザーのコンテキストでWebRequestを実行することは可能ですか?

または、App_Code内でこの関数を実行して、現在のユーザーRequestを使用できず、代わりにサーバーコンテキストを使用するという問題はありますか?

助けてください!

4

3 に答える 3

0

このコードはWebサーバーで実行されていると思います。クライアントがIPアドレスを確認できるページがありますか?もしそうなら、私はあなたが混乱していると思います。そうでない場合は、これが実行されている場所について詳しく説明してください。

上記のコードサーバーで実行されている場合、リモートサーバーに電話をかけて「このリクエストの送信元のIPアドレスは何ですか」と尋ねると、常にそのサーバーのパブリックIPアドレスを取得します。これがコードサンプルです。やっています。

あなたがあなたを呼んでいるクライアントのIPアドレスが必要な場合-あなたがウェブアプリケーションであると仮定して、あなたはHttpWebRequest.UserHostAddressを見る必要がありますが、これは絶対確実ではないことに注意してください。詳細については、こちらをご覧ください。

于 2012-05-15T09:24:35.520 に答える
0

これは発生するはずです。コードはマシン上で実行されているため、独自のIPアドレスを取得します。ユーザーから何かを取得するには、ユーザーから送信されたヘッダー、特にREMOTE_ADDRヘッダーを確認する必要があります。

おそらく、コードのどこかでRequest.ServerVariables["REMOTE_ADDR"]を使用できます。

于 2012-05-15T09:25:37.327 に答える
0

サーバーからリクエストを行うため、サーバーのIPアドレスを取得します。

どんなサービスをしているのかわかりません。WCFサービスの場合、リクエストのOperationContextオブジェクトのIncomingMessagePropertiesからIPアドレスを取得できます。ここで例を参照してください:WCFでクライアントのアドレスを取得する

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    string GetAddressAsString();
}

public class MyService : IMyService
{
    public string GetAddressAsString()
    {
        RemoteEndpointMessageProperty clientEndpoint =
            OperationContext.Current.IncomingMessageProperties[
            RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

        return String.Format(
            "{0}:{1}",
            clientEndpoint.Address, clientEndpoint.Port);
    }
}
于 2012-05-15T09:31:04.217 に答える