2015-07-09 3 views
2

Я работаю над приложением Windows, и у меня есть некоторые проблемы с куки-файлами. Обратите внимание, что я работаю с Windows.Web.Http, а не с пространством имен HttpClient.HttpClient (Windows.Web.Http), работающий с кукисами

API, с которым я работаю, использует аутентификационный заголовок для аутентификации. В основном после POST для входа в систему мне нужен способ вернуть файлы cookie, а затем использовать эти файлы cookie для выполнения последующих вызовов API. Я опубликовал пример того, что у меня есть, и это удается. Я вижу куки в объекте результата. Я просто не совсем уверен, куда идти отсюда/как действовать дальше. Благодаря! Есть идеи?

using MyApi.Interfaces; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.Web.Http; 
using Newtonsoft.Json; 
using MyApi.Models.Auth; 
using MyApi.Models; 

namespace MyApi 
{ 
    public class MyService 
    { 
     private const string MyBaseUrl = "http://api.my.com:3000"; 
     private readonly HttpClient _httpClient = new HttpClient(); 

    public async Task<SignInResponse> AttemptLogin(string username, string password) 
    { 
     if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) 
      throw new ArgumentException("Username or password is null or empty"); 

     var uri = new Uri(string.Format("{0}/{1}", MyBaseUrl, "auth/signin")); 

     var authSignIn = new Models.Auth.SignInRequest(); 
     authSignIn.Email = username; 
     authSignIn.Password = password; 

     var myObject = JsonConvert.SerializeObject(authSignIn); 

     // I see the headers in the result object, but I'm not 
     // sure the best way to a) get them out and b) shove them into 
     // all of the next calls 
     var result = await _httpClient.PostAsync(uri, 
      new HttpStringContent(myObject.ToString(), 
       Windows.Storage.Streams.UnicodeEncoding.Utf8, 
       "application/json")); 

     var content = await result.Content.ReadAsStringAsync(); 
     var successResponse = new SignInResponse(); 

     try 
     { 
      successResponse = JsonConvert.DeserializeObject<SignInResponse>(content); 
     } 
     catch (Exception) 
     { 
      var failResponse = JsonConvert.DeserializeObject<ErrorResponse>(content); 
      throw new Exception(failResponse.message); 
     } 

     return successResponse; 
    } 
} 
} 
+0

взглянуть на 'CookieContainer' в следующем сообщении ... Http://stackoverflow.com/questions/12373738/how-do-i-set-a-cookie-on-httpclients-httprequestmessage –

+0

Это фактически использует пространство имен System.Net, в то время как мое использует Windows.Web.Http. Он не отображается. Cookie Container доступен для пространства имен, с которым я работаю. – YnotDraw

+0

Привет, @YnotDraw Вы нашли решение по вашему вопросу? – alminh

ответ

2

Вы можете использовать HttpBaseProtocolFilter.CookieManager, например:

var filter = new HttpBaseProtocolFilter(); 
var cookieManager = filter.CookieManager; 

var uri = new Uri("http://api.my.com:3000"); 
foreach (var cookie in cookieManager.GetCookies(uri)) 
{ 
    Debug.WriteLine(cookie.Name); 
    Debug.WriteLine(cookie.Value); 
} 

Обратите внимание, если куки уже в HttpCookieContainer, печенье будут автоматически добавлены в последующих запросах к http://api.my.com:3000 и с вашей стороны никаких действий не требуется.

Если вы хотите изменить или удалить их, у HttpCookieContainer есть способы сделать это.

1

Посмотрите на Flurl. Она представляет собой свободно интерфейс над Http битом, так что вы можете сказать что-то подобное для аутентификации и повторно использовать соединение с печеньем:

using (var fc = new FlurlClient().EnableCookies()) 
{ 
    var url = new Url("http://api.com/endpoint") ; 

    await url 
     .AppendPathSegment("login") 
     .WithClient(fc) 
     .PostUrlEncodedAsync(new { user = "user", pass = "pass" }); 

    var page = await url 
      .AppendPathSegment("home") 
      .WithClient(fc) 
      .GetStringAsync(); 

    // Need to inspect the cookies? FlurlClient exposes them as a dictionary. 
    var sessionId = fc.Cookies["session_id"].Value; 

}