Using a proxy with .NET 4.5 HttpClient

.Netasp.net Web-Api.Net 4.5

.Net Problem Overview


I'm troubleshooting a bug with a service I call through .NET's HttpClient, trying to route the request through a local proxy (Fiddler), but my proxy settings seem to not be taking effect.

Here's how I create the client:

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;
}

then I send the request by:

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

Request goes straight to the server without attempting to hit the proxy. What did I miss?

.Net Solutions


Solution 1 - .Net

This code worked for me:

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

Note that I am not supplying an empty array to my WebProxy constructor. Perhaps that's the problem?

Solution 2 - .Net

Ah, The BaseAddress I was pointing to was http://localhost:8081. Turns out that despite setting BypassOnLocal to false, evidently localhost is still special enough that it bypasses the proxy.

I added a domain binding in IIS, host file entry to point that domain to 127.0.0.1, used newly created domain, now it works.

Solution 3 - .Net

Is Fiddler configured to capture traffic from all processes? Look at the status bar where you see "Capturing". It should show "All Processes" next to it. If it shows "Web browsers", click it and change it to all processes. This could be different depending on the version of Fiddler you use.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMike RuhlinView Question on Stackoverflow
Solution 1 - .NetNathanAldenSrView Answer on Stackoverflow
Solution 2 - .NetMike RuhlinView Answer on Stackoverflow
Solution 3 - .NetBadriView Answer on Stackoverflow