我使用此代码获取公共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中运行此函数以使当前用户请求不可用,而是使用服务器上下文?
请帮忙!
答案 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);
}
}