使用DynDNS和WebRequest C#获取公共IP

时间:2012-05-15 09:17:41

标签: c# ip dyndns

我使用此代码获取公共IP地址(感谢此帖子How to get the IP address of the server on which my C# application is running on?):

    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";
        }
    }

但无论谁访问我的网站,他们都获得相同的IP,它是服务器公共IP,而不是当前用户的IP。

是否可以在当前用户的上下文中运行WebRequest,而不是作为服务器?

或者问题是我在App_Code中运行此函数以使当前用户请求不可用,而是使用服务器上下文?

请帮忙!

3 个答案:

答案 0 :(得分:0)

我猜这个代码是在网络服务器上运行的 - 你有一个页面让客户检查他们的IP地址?如果是这样,我怀疑你很困惑。如果没有,请详细说明它的运行位置。

如果上面的代码在服务器上运行,那么如果您拨打远程服务器并询问“此请求来自哪个IP地址,您将始终获得该服​​务器的公共IP地址来自“ - 这是您的代码示例正在做的事情。

如果您想要呼叫您的客户端的IP地址 - 假设您是一个Web应用程序,那么您应该查看HttpWebRequest.UserHostAddress,但请注意这不是万无一失的。有关详细信息,请查看here

答案 1 :(得分:0)

这应该会发生,代码在您的计算机上运行,​​因此您可以获得自己的IP地址。要从用户处获取内容,您必须检查用户发送的标头,特别是 REMOTE_ADDR 标头。

您可以在某处的代码中使用 Request.ServerVariables [“REMOTE_ADDR”]

答案 2 :(得分:0)

由于您是从服务器发出请求,因此您将获得服务器的IP地址。

我不确定你有什么样的服务。对于WCF服务,您可以从请求的OperationContext对象的IncomingMessageProperties中获取IP地址。请在此处查看示例:Get the Client’s Address in 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);
    }
}