【问题标题】:Sending Local IP address of connection associated with HttpWebrequest (C#)发送与 HttpWebrequest (C#) 关联的连接的本地 IP 地址
【发布时间】:2010-12-19 19:10:50
【问题描述】:

我正在开发一个应用程序,它有一个 Web 服务器和一个将 XML 发布到 Web 服务器的 C# 客户端。 Web 服务器需要知道客户端的本地 IP 地址。我尝试了在服务器端检索 IP 地址的方法,但是当中间有代理服务器或 NAT 时,这些方法不会给出客户端的 IP 地址。所以我需要在客户端应用程序中找到连接的本地 IP 并与请求一起发送。

问题出在HttpWebRequest。我没有看到任何方法可以在发送 HTTP 请求时获取连接的本地 IP 地址。

澄清:
我的客户端不是基于浏览器的。它是一个 C# 应用程序。我的服务器有基于本地 IP 的特定规则,用于在发送 HTTP 请求时连接到服务器。就我而言,本地 IP 是固定的。本地机器上可能有多个 IP——这就是为什么我想要与用于发送请求的 Socket 关联的本地 IP。如果我在 C# 中使用 TcpClient 并在其上实现 HTTP 协议,则可以解决此问题,但我想避免这种情况。那么,有什么方法可以在发布请求之前获取与HttpWebRequest 关联的套接字?

【问题讨论】:

  • 要添加到 CodeByMoonlights 答案,这将是不可靠的,是什么让您认为客户端只有 1 个 IP 地址?我认为,NAT 可能 会妨碍这一事实表明这不是 Intranet 场景。所以也许退后一步,告诉我们您要解决的问题,而不是您已经设计的解决方案的问题。

标签: c# httpwebrequest ip


【解决方案1】:

无法获取 HttpWebRequest 将要使用的连接的本地 IPAddress。但是,您可以使用 Dns 或 System.Net.NetworkInformation 类来获取所有本地 IP 地址,并将它们作为自定义标头与您的请求一起发送。在服务器端,您可以解析此标头,并查看是否有任何 IP 与您期望的匹配。

但是,正如 Damien 上面所指出的,这种解决方案并非万无一失,人们可能会将 IP 地址欺骗为服务器所期望的地址。也许你需要退后一步,想想你想通过这个实现什么安全?看看您是否可以通过不同的方法来实现您的目标 - 例如:使用支持的方法(如 Basic(通过 HTTPS)、Digest、NTLM、Kerberos、Negotiate 或将 SSL 与客户端证书一起使用)进行用户身份验证?

【讨论】:

    【解决方案2】:

    没有保证的方法可以做到这一点。 Javascript 和服务器端代码只能看到公共地址,不能看到本地地址。有一种使用 Java 获取它的方法(提到 here),但它依赖于可用的 Javascript 和 Java,以及支持该特定调用的用户浏览器。

    鉴于根据需要分配了许多本地 IP(我的家用 PC 使用 DHCP 分配,我的工作 PC 也偶尔更改),您认为知道本地 IP 真的有用吗?

    【讨论】:

      【解决方案3】:

      如果您通过线路发送的内容是 XML,也许您应该从 HttpWebRequest 转移到 SOAP 请求/响应。实现 ASPX Web 服务或 WFC Web 服务。 HttpWebRequest 始终被服务器看到,因为它们来自发出它们的最后一个 IP,因此是 NAT 或代理。

      但是,我也觉得很奇怪,您需要知道服务器端的本地计算机 IP。

      【讨论】:

        【解决方案4】:

        一种可能的解决方案是告诉客户端在连接到服务器时应该使用什么 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          • 2019-04-25
          • 2010-12-28
          • 2011-06-06
          • 2012-01-11
          相关资源
          最近更新 更多