使用带有 .NET 4.5 HttpClient 的代理

Posted

技术标签:

【中文标题】使用带有 .NET 4.5 HttpClient 的代理【英文标题】:Using a proxy with .NET 4.5 HttpClient 【发布时间】:2013-05-07 18:15:22 【问题描述】:

我正在解决我通过 .NET 的 HttpClient 调用的服务的错误,尝试通过本地代理 (Fiddler) 路由请求,但我的代理设置似乎没有生效。

我是这样创建客户端的:

private HttpClient CreateHttpClient(CommandContext ctx, string sid) 
    var cookies = new CookieContainer();

    var handler = new HttpClientHandler 
        CookieContainer = cookies,
        UseCookies = true,
        UseDefaultCredentials = false,
        Proxy = new WebProxy("http://localhost:8888", false, new string[]),
        UseProxy = true,
    ;

    // snip out some irrelevant setting of authentication cookies

    var client = new HttpClient(handler) 
        BaseAddress = _prefServerBaseUrl,
    ;

    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));

    return client;

然后我通过以下方式发送请求:

var response = CreateHttpClient(ctx, sid).PostAsJsonAsync("api/prefs/", smp).Result;

请求直接发送到服务器而不尝试访问代理。我错过了什么?

【问题讨论】:

您的服务是否在您的本地机器上进行测试?考虑绕过本地地址的代理。 顺便说一句,创建HttpClient 实例的成本很高。您应该尽可能重用实例。有几篇博文讨论了使用 Google 实现的可达性。 【参考方案1】:

这段代码对我有用:

var httpClientHandler = new HttpClientHandler
                        
                            Proxy = new WebProxy("http://localhost:8888", false),
                            UseProxy = true
                        

请注意,我没有向 WebProxy 构造函数提供空数组。也许这就是问题所在?

【讨论】:

删除字符串数组也对我有用。我必须进入 HOSTS 才能让代理在 localhost 上工作。 你拯救了我的一天^_^【参考方案2】:

啊,我指向的 BaseAddress 是http://localhost:8081。事实证明,尽管将 BypassOnLocal 设置为 false,但显然 localhost 仍然足够特殊,可以绕过代理。

我在 IIS 中添加了域绑定,主机文件条目将该域指向 127.0.0.1,使用了新创建的域,现在它可以工作了。

【讨论】:

我收到错误请求 - 当我将 .在本地主机之后 @DarrelMiller 添加本地主机后我没有得到任何更改。 <system.net> <defaultProxy> <proxy bypassonlocal="False" usesystemdefault="True" proxyaddress="http://localhost.:8888" /> </defaultProxy> </system.net>【参考方案3】:

Fiddler 是否配置为捕获来自所有进程的流量?查看您看到“正在捕获”的状态栏。它应该在它旁边显示“所有进程”。如果它显示“Web 浏览器”,单击它并将其更改为所有进程。根据您使用的 Fiddler 版本,这可能会有所不同。

【讨论】:

以上是关于使用带有 .NET 4.5 HttpClient 的代理的主要内容,如果未能解决你的问题,请参考以下文章

.net 4.0 和 .net 4.5 中的 HttpClient 有啥区别

在 .net 4.5 中尝试使用 HttpClient 使 cookie 无法响应

csharp 使用基本身份验证和代理的简单C#.NET 4.5 HTTPClient请求

.NET 4.5 和 C# 中带有 HttpClient 的 HTTP HEAD 请求

如何在 C# (.NET 4.5) 中为 HttpClient.GetAsync(URI) 创建回调?

.Net 4.5 中的异步 HttpClient 对于密集负载应用程序来说是一个糟糕的选择吗?