4

Я работаю в проекте Windows Phone 8 PCL. Я использую сторонний REST API, и мне нужно использовать несколько файлов HttpOnly, созданных API. Кажется, что получение/доступ к файлам cookie HttpOnly из CookieContainer HttpClientHandler невозможно, если вы не используете отражение или какой-либо другой бэкдор.Как я могу получить файлы cookie HttpOnly в Windows Phone 8?

Мне нужно получить эти файлы cookie и отправить их в последующих запросах, иначе я не буду работать с этим API - как я могу это сделать? Вот как выглядит мой текущий код запроса:

Заранее спасибо.

//Some request 
HttpRequestMessage request = new HttpRequestMessage(); 
HttpClientHandler handler = new HttpClientHandler(); 

//Cycle through the cookie store and add existing cookies for the susbsequent request 
foreach (KeyValuePair<string, Cookie> cookie in CookieManager.Instance.Cookies) 
{ 
      handler.CookieContainer.Add(request.RequestUri, new Cookie(cookie.Value.Name, cookie.Value.Value)); 
} 

//Send the request asynchronously 
HttpResponseMessage response = await httpClient.SendAsync(request); 
response.EnsureSuccessStatusCode(); 

//Parse all returned cookies and place in cookie store 
foreach (Cookie clientcookie in handler.CookieContainer.GetCookies(request.RequestUri)) 
{ 
    if (!CookieManager.Instance.Cookies.ContainsKey(clientcookie.Name)) 
       CookieManager.Instance.Cookies.Add(clientcookie.Name, clientcookie); 
      else 
       CookieManager.Instance.Cookies[clientcookie.Name] = clientcookie; 
} 

HttpClient httpClient = new HttpClient(handler); 

ответ

4

HttpOnly печенья находится внутри CookieContainer, это только то, что не подвергается. Если вы установите тот же экземпляр этого CookieContainer для следующего запроса, он установит скрытый файл cookie (пока запрос будет сделан на тот же сайт, указанный в cookie).

Это решение будет работать, пока вам не понадобится сериализовать и десериализовать CookieContainer, потому что вы восстанавливаете состояние. Как только вы это сделаете, вы потеряете куки HttpOnly, скрытые внутри CookieContainer. Таким образом, более постоянное решение будет использовать Sockets напрямую для этого запроса, прочитать необработанный запрос в виде строки, извлечь файл cookie и установить его на следующие запросы. Вот код для использования сокетов в Windows Phone 8:

public async Task<string> Send(Uri requestUri, string request) 
{ 
    var socket = new StreamSocket(); 
    var hostname = new HostName(requestUri.Host); 
    await socket.ConnectAsync(hostname, requestUri.Port.ToString()); 

    var writer = new DataWriter(socket.OutputStream); 
    writer.WriteString(request); 
    await writer.StoreAsync(); 

    var reader = new DataReader(socket.InputStream) 
    { 
     InputStreamOptions = InputStreamOptions.Partial 
    }; 
    var count = await reader.LoadAsync(512); 

    if (count > 0) 
     return reader.ReadString(count); 
    return null; 
} 
+0

Удивительный, именно то, что мне нужно! Благодарю. – Nick

0

Существует также вторая возможность - вручную пройти через заголовки ответа, грейфер, а затем анализировать заголовки Set-Cookie, используя кучу пользовательского кода.

Это выглядит примерно так, что, когда вы собираетесь, чтобы соответствовать и сохранить одно PHPSESSID печенье (предположим LatestResponse ваш HttpResponseMessage содержащий сайт ответа):

if (LatestResponse.Headers.ToString().IndexOf("Set-Cookie:") != -1) try 
     { 
      string sid = LatestResponse.Headers.ToString(); 
      sid = sid.Substring(sid.IndexOf("Set-Cookie:"), 128); 
       if (sid.IndexOf("PHPSESSID=") != -1) 
       { 
        settings.Values["SessionID"] = SessionID = sid.Substring(sid.IndexOf("PHPSESSID=") + 10, sid.IndexOf(';') - sid.IndexOf("PHPSESSID=") - 10); 
        handler.CookieContainer.Add(new Uri("http://example.com", UriKind.Absolute), new System.Net.Cookie("PHPSESSID", SessionID)); 
       } 
     } catch (Exception e) { 
      // your exception handling 
     } 

Примечание Этот код вставляет куки в CookieContainer для этого жизни объекта, если он не удален вручную. Если вы хотите включить его в новый объект, просто потяните правильное значение настройки и добавьте его в новый контейнер.

 Смежные вопросы

  • Нет связанных вопросов^_^