2017-01-11 2 views
1

Проблема: Я пытаюсь использовать httpclient для извлечения данных с сайта. Теперь сайту требуется, чтобы вы сначала посетили ссылку, и только вы можете отправить данные на следующую ссылку. Link1 - это простой запрос на получение запроса Link2 - это запрос на отправку Теперь я думаю, что сайт сначала хранит некоторые файлы cookie из ссылки1, а затем разрешает отправлять данные в link2, как всякий раз, когда я пытаюсь открыть ссылку2 в инкогнито, на сайте отображается сообщение об ошибке «. Session Timed из OR Максимальный предел соединения достигается не дальше может Пожалуйста, закройте и перезапустите ваш браузер» Теперь я попытался это:Httpclient Cookie Issue

try 
     { 
      //Send the GET request 
      httpResponse = await httpClient.GetAsync(new Uri(link1UriString)); 
      //Send the POSTrequest 
      httpResponse = await httpClient.PostAsync(new Uri(link2uriString),postContent);     
      httpResponseBody = await httpResponse.Content.ReadAsStringAsync(); 

      } 

Но я получаю сеанс истекло сообщение об ошибке. Как сохранить куки для сессии в HTTPClient непрерывно, полученной от web.Like в питоне это может быть сделано с помощью

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) 
urllib2.install_opener(opener) 

Link1
Link2

ответ

2

Вы можете использовать CookieContainer обрабатывать печенье для вас.
Сделав это, вы должны создать HttpClient следующим образом.

using System.Net; 
using System.Net.Http; 

CookieContainer cookies = new CookieContainer(); 
HttpClientHandler handler = new HttpClientHandler(); 
handler.CookieContainer = cookies; 
HttpClient httpClient = new HttpClient(handler); 

httpResponse = await httpClient.GetAsync(new Uri(link1UriString)); 

(Обратите внимание, что использует версию HttpClient в System.Net.Http)

+0

Отлично, я забыл про 'CookieContainer' :), ваш ответ более элегантный –

+0

Привет, благодарю вас, благодарю за ваш ответ. Теперь данные, которые мне нужно отправить, содержат целое число и строку, но FormurlEncodedContent принимает только строковые значения. Любая идея, как публиковать эти данные с помощью httpClinet.PostAsync() или любыми другими методами – Uwpbeginner

+0

@ Uwpbeginner делает этот ответ, не работает для вас http://stackoverflow.com/a/41620514/1755 –

1

Таким образом, после первого ответа у вас есть Set-Cookie заголовок:

var responseMessage = await httpClient.GetAsync("http://115.248.50.60/registration/Main.jsp?wispId=1&nasId=00:15:17:c8:09:b1"); 
IEnumerable<string> values; 
var coockieHeader = string.Empty; 
if (responseMessage.Headers.TryGetValues("set-cookie", out values)) 
{ 
    coockieHeader = string.Join(string.Empty, values); 
} 

После этого, просто настроить ваше печенье в сообщение с запросом:

 var httpRequestMessage = new HttpRequestMessage 
     { 
      RequestUri = new Uri("http://115.248.50.60/registration/chooseAuth.do"), 
      Content = postContent, 
      Method = HttpMethod.Post 
     }; 

     httpRequestMessage.Headers.Add("Cookie", values); 
     var httpResponse = await httpClient.SendAsync(httpRequestMessage); 
+0

Эй, @ Andrii Krupka благодарит за ваш ответ, но метод Мэтта был проще реализовать. – Uwpbeginner