I am trying to use the web api\'s HttpClient
to do a post to an endpoint that requires login in the form of an HTTP cookie that identifies an account (this is only something that is #ifdef
\'ed out of the release version).
How do I add a cookie to the HttpRequestMessage
?
Here\'s how you could set a custom cookie value for the request:
var baseAddress = new Uri(\"http://example.com\");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>(\"foo\", \"bar\"),
new KeyValuePair<string, string>(\"baz\", \"bazinga\"),
});
cookieContainer.Add(baseAddress, new Cookie(\"CookieName\", \"cookie_value\"));
var result = client.PostAsync(\"/test\", content).Result;
result.EnsureSuccessStatusCode();
}
The accepted answer is the correct way to do this in most cases. However, there are some situations where you want to set the cookie header manually. Normally if you set a \"Cookie\" header it is ignored, but that\'s because HttpClientHandler
defaults to using its CookieContainer
property for cookies. If you disable that then by setting UseCookies
to false
you can set cookie headers manually and they will appear in the request, e.g.
var baseAddress = new Uri(\"http://example.com\");
using (var handler = new HttpClientHandler { UseCookies = false })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var message = new HttpRequestMessage(HttpMethod.Get, \"/test\");
message.Headers.Add(\"Cookie\", \"cookie1=value1; cookie2=value2\");
var result = await client.SendAsync(message);
result.EnsureSuccessStatusCode();
}
After spending hours on this issue, none of the answers above helped me so I found a really useful tool.
Firstly, I used Telerik\'s Fiddler 4 to study my Web Requests in details
Secondly, I came across this useful plugin for Fiddler:
https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode
It will just generate the C# code for you. An example was:
var uriBuilder = new UriBuilder(\"test.php\", \"test\");
var httpClient = new HttpClient();
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uriBuilder.ToString());
httpRequestMessage.Headers.Add(\"Host\", \"test.com\");
httpRequestMessage.Headers.Add(\"Connection\", \"keep-alive\");
// httpRequestMessage.Headers.Add(\"Content-Length\", \"138\");
httpRequestMessage.Headers.Add(\"Pragma\", \"no-cache\");
httpRequestMessage.Headers.Add(\"Cache-Control\", \"no-cache\");
httpRequestMessage.Headers.Add(\"Origin\", \"test.com\");
httpRequestMessage.Headers.Add(\"Upgrade-Insecure-Requests\", \"1\");
// httpRequestMessage.Headers.Add(\"Content-Type\", \"application/x-www-form-urlencoded\");
httpRequestMessage.Headers.Add(\"User-Agent\", \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\");
httpRequestMessage.Headers.Add(\"Accept\", \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\");
httpRequestMessage.Headers.Add(\"Referer\", \"http://www.translationdirectory.com/\");
httpRequestMessage.Headers.Add(\"Accept-Encoding\", \"gzip, deflate\");
httpRequestMessage.Headers.Add(\"Accept-Language\", \"en-GB,en-US;q=0.9,en;q=0.8\");
httpRequestMessage.Headers.Add(\"Cookie\", \"__utmc=266643403; __utmz=266643403.1537352460.3.3.utmccn=(referral)|utmcsr=google.co.uk|utmcct=/|utmcmd=referral; __utma=266643403.817561753.1532012719.1537357162.1537361568.5; __utmb=266643403; __atuvc=0%7C34%2C0%7C35%2C0%7C36%2C0%7C37%2C48%7C38; __atuvs=5ba2469fbb02458f002\");
var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;
var httpContent = httpResponseMessage.Content;
string result = httpResponseMessage.Content.ReadAsStringAsync().Result;
Note that I had to comment out two lines as this plugin is not totally perfect yet but it did the job nevertheless.
DISCLAIMER: I am not associated or endorsed by either Telerik or the plugin\'s author in anyway.