53

我正在解决我通过.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;

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

4

3 回答 3

53

这段代码对我有用:

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

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

于 2014-07-10T12:57:58.100 回答
9

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

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

于 2013-05-13T16:34:32.547 回答
3

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

于 2013-05-13T16:30:06.773 回答