我可以使用 .NET Framework 从指定的 IP 地址发送 Web 请求吗?

Posted

技术标签:

【中文标题】我可以使用 .NET Framework 从指定的 IP 地址发送 Web 请求吗?【英文标题】:Can I send webrequest from specified ip address with .NET Framework? 【发布时间】:2010-11-25 03:18:21 【问题描述】:

我有一个多 IP 地址的服务器。现在我需要使用 http 协议与几台服务器通信。每台服务器只接受来自我服务器指定IP地址的请求。但是在 .NET 中使用 WebRequest(或 HttpWebRequest)时,请求对象会自动选择一个 IP 地址。我无论如何都找不到将请求与地址绑定。

有没有办法这样做?还是我必须自己实现一个 webrequest 类?

【问题讨论】:

【参考方案1】:

您需要使用ServicePoint.BindIPEndPointDelegate 回调。

http://blogs.msdn.com/b/malarch/archive/2005/09/13/466664.aspx

委托在与 httpwebrequest 关联的套接字尝试连接到远程端之前被调用。

public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)

    Console.WriteLine("BindIPEndpoint called");
      return new IPEndPoint(IPAddress.Any,5000);



public static void Main()


    HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://MyServer");

    request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();


【讨论】:

太棒了。问题就这么简单的解决了!谢谢,山姆。 我不建议将端口设置为 5000。如果您在此端口上使用多个实例发出请求,这可能会导致超时。相反,我会将端口设置为 0 并让 tcp 层处理连接,无论如何这将始终通过端口 80。 它在 .NET Framework 上运行良好,但在 .NET Core 上无法运行,我不知道为什么。【参考方案2】:

如果您想使用 WebClient 来执行此操作,您需要对其进行子类化:

var webClient = new WebClient2(IPAddress.Parse("10.0.0.2"));

和子类:

public class WebClient2 : WebClient

    public WebClient2(IPAddress ipAddress) 
        _ipAddress = ipAddress;
    

    protected override WebRequest GetWebRequest(Uri address)
    
        WebRequest request = (WebRequest)base.GetWebRequest(address);

        ((HttpWebRequest)request).ServicePoint.BindIPEndPointDelegate += (servicePoint, remoteEndPoint, retryCount) => 

            return new IPEndPoint(_ipAddress, 0);
        ;

        return request;
    

(感谢@Samuel 提供了所有重要的 ServicePoint.BindIPEndPointDelegate 部分)

【讨论】:

【参考方案3】:

不确定您是否阅读过这篇文章(?)

How to specify server IP in HttpWebRequest

Specifying Source IP of HttpWebRequest

【讨论】:

以上是关于我可以使用 .NET Framework 从指定的 IP 地址发送 Web 请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Entity Framework 6 从 .Net 应用程序访问雪花数据库

mysql 安装异常:this application requires .NET Framework(尚未安装.NET Framework 4.5 原因是:指定)

System.FormatException 从 4.7 运行 .NET Framework 2.0

如何使用 Terraform azurerm_app_service 指定 .net 核心版本

如何使用 .NET compact framework 2.0 播放 MIDI 文件?

如何从 24 位十六进制获取 RGB 值(不使用 .NET Framework)[重复]