You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用Rotation Proxy无法每次请求切换IP,仅重启程序生效的问题

解决C#中每次请求切换代理IP的问题

问题分析

你的代码存在两个关键问题:

  1. 死循环无法返回结果:while(true)会导致方法永远执行不到return语句,属于逻辑错误。
  2. 连接池复用导致代理IP不切换:.NET默认会复用HTTP连接(连接池机制),代理服务器会将复用的连接识别为同一个会话,因此不会分配新IP。

解决方案1:修改现有WebRequest代码

通过禁用连接复用,强制每次请求新建连接,让代理服务器识别为新会话从而分配新IP,同时修正死循环问题:

public static string GetIPAddress()
{
    string address = string.Empty;
    // 移除死循环,改为单次请求(如需循环获取可自行调整逻辑)
    var request = WebRequest.Create("http://checkip.dyndns.org/") as HttpWebRequest;
    if (request == null) return address;

    // 禁用连接复用,强制每次请求新建连接
    request.KeepAlive = false;
    // 立即释放连接,避免连接池保留会话
    ServicePointManager.FindServicePoint(request.RequestUri).ConnectionLeaseTimeout = 0;

    // 每次请求创建新的WebProxy实例
    request.Proxy = new WebProxy("http://gw.dataimpulse.com:823");              
    
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        address = stream.ReadToEnd();
    }

    // 解析返回的IP地址
    int first = address.IndexOf("Address: ") + 9;
    int last = address.LastIndexOf("</body>");
    return address.Substring(first, last - first);
}

解决方案2:使用HttpClient(推荐)

HttpClient是.NET官方推荐的HTTP请求库,更易维护且性能更优。通过自定义HttpClientHandler禁用连接池,确保每次请求都是新连接:

// 自定义Handler,处理代理和连接复用逻辑
public class RotatingProxyHandler : HttpClientHandler
{
    private readonly string _proxyAddress;

    public RotatingProxyHandler(string proxyAddress)
    {
        _proxyAddress = proxyAddress;
        // 禁用连接池,强制每次请求新建连接
        PooledConnectionLifetime = TimeSpan.Zero;
        PooledConnectionIdleTimeout = TimeSpan.Zero;
        KeepAlive = false;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 每次请求设置新的代理实例
        Proxy = new WebProxy(_proxyAddress);
        return base.SendAsync(request, cancellationToken);
    }
}

// 使用示例(异步方法,更符合.NET现代编程规范)
public static async Task<string> GetIPAddressAsync()
{
    using var handler = new RotatingProxyHandler("http://gw.dataimpulse.com:823");
    using var httpClient = new HttpClient(handler);

    var response = await httpClient.GetAsync("http://checkip.dyndns.org/");
    response.EnsureSuccessStatusCode();
    var content = await response.Content.ReadAsStringAsync();

    // 解析IP地址
    int first = content.IndexOf("Address: ") + 9;
    int last = content.LastIndexOf("</body>");
    return content.Substring(first, last - first);
}

额外说明

如果你的旋转代理需要主动获取新IP地址(而非服务器端自动切换),需要在每次请求前调用代理服务商的API获取新的代理地址,再设置到请求中:

// 示例:从代理API获取新的代理地址
private static string FetchNewProxyAddress()
{
    using var client = new HttpClient();
    // 替换为你的代理服务商API地址
    return client.GetStringAsync("http://your-proxy-provider-api.com/get-new-proxy").Result.Trim();
}

// 修改后的请求方法
public static string GetIPAddressWithDynamicProxy()
{
    string address = string.Empty;
    string proxyAddress = FetchNewProxyAddress();
    
    var request = WebRequest.Create("http://checkip.dyndns.org/") as HttpWebRequest;
    if (request == null) return address;

    request.KeepAlive = false;
    request.Proxy = new WebProxy(proxyAddress);              
    
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        address = stream.ReadToEnd();
    }

    int first = address.IndexOf("Address: ") + 9;
    int last = address.LastIndexOf("</body>");
    return address.Substring(first, last - first);
}

内容的提问来源于stack exchange,提问作者Ayman Ebrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:17:05