웹 API를 사용하여 HttpClient
계정을 식별하는 HTTP 쿠키 형식으로 로그인 해야하는 끝점에 게시하려고합니다 (이것은 #ifdef
릴리스 버전에서 나온 것입니다).
에 쿠키를 어떻게 추가 HttpRequestMessage
합니까?
답변
요청에 대한 맞춤 쿠키 값을 설정하는 방법은 다음과 같습니다.
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 = await client.PostAsync("/test", content);
result.EnsureSuccessStatusCode();
}
답변
허용 대답은 대부분의 경우이 작업을 수행하는 올바른 방법입니다. 그러나 쿠키 헤더를 수동으로 설정하려는 상황이 있습니다. 일반적으로 “쿠키”헤더를 설정하면 헤더가 무시되지만 HttpClientHandler
기본적으로 CookieContainer
쿠키 의 속성 을 사용 하기 때문 입니다. 이를 비활성화하면로 설정 UseCookies
하여 false
쿠키 헤더를 수동으로 설정할 수 있으며 요청에 쿠키 헤더가 표시됩니다.
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();
}
답변
이 문제에 대해 몇 시간을 보낸 후 위의 답변 중 어느 것도 도움이되지 않아서 정말 유용한 도구를 찾았습니다.
먼저 Telerik의 Fiddler 4를 사용하여 웹 요청을 자세히 연구했습니다.
두 번째로, 나는 Fiddler를위한이 유용한 플러그인을 발견했습니다 :
https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode
C # 코드를 생성합니다. 예를 들면 다음과 같습니다.
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;
이 플러그인이 아직 완벽하지는 않지만 두 줄을 주석 처리해야하지만 그럼에도 불구하고 작업을 수행했습니다.
면책 조항 : 나는 Telerik 또는 플러그인 작성자와 관련이 있거나 보증하지 않습니다.
답변
나에게 간단한 솔루션은 HttpRequestMessage 객체에 쿠키를 설정하는 것 입니다.
protected async Task<HttpResponseMessage> SendRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken = default(CancellationToken))
{
requestMessage.Headers.Add("Cookie", $"<Cookie Name 1>=<Cookie Value 1>;<Cookie Name 2>=<Cookie Value 2>");
return await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
}