c# - 如何在 HttpWebRequest 中更改原始 IP

标签 c# httpwebrequest ip webrequest

我在分配了 5 个 IP 的服务器上运行此应用程序。我使用 HttpWebRequest 从网站获取一些数据。但是当我建立连接时,我能够指定从 5 个 IP 中的哪一个建立连接。 HttpWebRequest 是否支持这个?如果不能,我可以从它继承一个类来改变它的行为吗?我在这里需要这样的想法。

我现在的代码是这样的:

System.Net.WebRequest request = System.Net.WebRequest.Create(link);
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
    StreamReader sr = new StreamReader(response.GetResponseStream());
    return sr.ReadToEnd();
}

最佳答案

根据 this , 不。您可能不得不使用套接字,我知道您可以在其中选择本地 IP。

编辑:实际上,这似乎是可能的。 HttpWebRequest 有一个 ServicePoint 属性,它又具有 BindIPEndPointDelegate ,这可能是您正在寻找的。

给我一​​分钟,我要举个例子...

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com");

req.ServicePoint.BindIPEndPointDelegate = delegate(
    ServicePoint servicePoint,
    IPEndPoint remoteEndPoint,
    int retryCount) {

    if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) {
        return new IPEndPoint(IPAddress.IPv6Any, 0);
    } else {
        return new IPEndPoint(IPAddress.Any, 0);
    }

};

Console.WriteLine(req.GetResponse().ResponseUri);

基本上,委托(delegate)必须返回一个 IPEndPoint。你可以选择任何你想要的,但如果它不能绑定(bind)到它,它会再次调用委托(delegate),最多 int.MAX_VALUE 次。这就是我包含处理 IPv6 的代码的原因,因为 IPAddress.Any 是 IPv4。

如果您不关心 IPv6,则可以摆脱它。另外,我将 IP 地址的实际选择作为练习留给读者:)

关于c# - 如何在 HttpWebRequest 中更改原始 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3345387/

相关文章:

c# - 如何捕捉 CancellationToken.ThrowIfCancellationRequested

c# - 将非属性绑定(bind)到数据网格列 DataField?

c# - httpwebrequest 和 javascript

c# - 如何拆分字符串然后将字符串的每个部分放在文本框中

python - 对 Docker 容器的 HTTP 调用将 IP 重定向到 Docker ID

c# - EWS 交换有时不会使用 StreamingSubscription 触发 NewMail 事件

http - 用 HTTP GET 请求设置 cookie 可以吗?

c# - .NET Core 中 WebRequest 的重定向

networking - 环回地址的真实示例

c# - 如何使用 Entity Framework 按日期而不是随时间分组