我正在开发一个应用程序,它有一个Web服务器和一个C#客户端,它将XML发布到Web服务器。 Web服务器需要知道客户端的本地IP地址。我尝试了在服务器端检索IP地址的方法,但是当存在代理服务器或NAT时,这些方法不提供客户端的IP地址。所以我需要在客户端应用程序中找到连接的本地IP,并将其与请求一起发送。
问题出在HttpWebRequest
。我没有看到任何方法可以在发送HTTP请求时获取连接的本地IP地址。
澄清:
在我的情况下,客户端不是基于浏览器的。它是一个C#应用程序。我的服务器具有基于本地IP的特定规则,用于在发送HTTP请求时连接到服务器。就我而言,本地IP是固定的。本地计算机上可能有多个IP - 这就是为什么我希望与用于发送请求的Socket
关联的本地IP。如果我在C#中使用TcpClient
并在其上实现HTTP协议,这可以解决,但我想避免这种情况。那么,在发布请求之前,我有没有办法让HttpWebRequest
与套接字相关联?
答案 0 :(得分:1)
无法获取HttpWebRequest将要使用的连接的本地IPAddress。但是,您可以使用Dns或System.Net.NetworkInformation类来获取所有本地IP地址,并将它们作为自定义标头发送给您的请求。在服务器端,您可以解析此标头,并查看是否有任何IP与您期望的IP匹配。
然而,正如Damien上面所说,这个解决方案并非万无一失,人们可以将IP地址欺骗到服务器所期望的那个。也许你需要退后一步,想想你想要达到什么样的安全性呢?并且看看你是否可以通过不同的方法实现目标 - 例如:用户使用支持的方法进行身份验证,如基本(通过HTTPS),摘要,NTLM,Kerberos,协商,或者使用SSL与客户端证书?
答案 1 :(得分:0)
没有保证这样做的方法。 Javascript和服务器端代码只能看到公共地址,而不能看到本地地址。有一种使用Java(提到here)获取它的方法,但它依赖于Javascript和Java可用,以及用户的浏览器支持该特定调用。
鉴于根据需要分配了许多本地IP(我的家用PC是使用DHCP分配的,我的工作PC也发生了变化),您认为知道本地IP实际上是否有用?
答案 2 :(得分:0)
如果您通过线路发送XML,也许您应该从HttpWebRequest转移到SOAP请求/响应。实施ASPX Web服务或WFC Web服务。 HttpWebRequest始终可以看到服务器,因为它们来自发布它们的最后一个IP,因此它们将是NAT或代理。
但是,我也觉得很奇怪你需要知道服务器端的本地机器IP。
答案 3 :(得分:0)
一种可能的解决方案是告诉客户端连接到服务器时应该使用什么IP,并将该ip包含在自定义标头中以供服务器读取。
var srcip = IPAddress.Parse("10.0.0.1");
var request = (HttpWebRequest)HttpWebRequest.Create ("http://example.com/");
request.Headers.Add("X-Original-Client-IP", srcip.ToString());
request.ServicePoint.BindIPEndPointDelegate = delegate { return new IPEndPoint(srcip, 0); };
request.GetResponse();