我刚遇到这种奇怪的行为,我可以使用以下代码重现:
var request = new HttpRequestMessage(new HttpMethod("POST"), "/api/mymethod");
request.Headers.Add("Cookie", "mycookie");
request.Headers.Add("Cookie2", "mycookie");
request.Content = new StringContent("<foo></foo>", Encoding.UTF8, "application/xml");
return httpClient.SendAsync(request);
然后我使用necat记录请求,我看到Cookie2
存在,但Cookie
不存在!
POST /api/mymethod HTTP/1.1
Cookie2: mycookie
Content-Type: application/xml; charset=utf-8
Host: localhost:7777
Content-Length: 11
Expect: 100-continue
Connection: Keep-Alive
<foo></foo>
似乎HttpRequestMessage不顾一切地忽略了Cookie
标题,我想知道它为什么会这样。
有没有办法强制添加Cookie?我想也许他们这样做是为了强制执行良好的编码实践,但是现在我正在制作一个简短的一次性脚本来自动执行手动任务(即使cookie在我的代码中是硬编码的),我对此行为感到惊讶。
从https://stackoverflow.com/a/13287224/492336开始,您可以设置HttpClientHandler
UseCookies
设为false,然后就可以了:
HttpClient httpClient = new HttpClient(new HttpClientHandler { UseCookies = false }) { BaseAddress = new Uri(ConfigurationManager.AppSettings["server"]) };
无论如何,你可能不应该将它用于非一次性代码。