2016-04-26 3 views
2

Я пытаюсь установить файлы cookie и получать файлы cookie из общего метода. Я видел, что этот пример работает, но у меня возникают проблемы с изменением моего собственного кода таким образом, что я могу сохранить свою общую функцию.HTTP Client Cookie C#

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

HttpClient client = new HttpClient(handler); 
HttpResponseMessage response = client.GetAsync("http://google.com").Result; 

Uri uri = new Uri("http://google.com"); 
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>(); 
foreach (Cookie cookie in responseCookies) 
    Console.WriteLine(cookie.Name + ": " + cookie.Value); 

Console.ReadLine(); 

Мой код:

public static HttpClient CreateClientASMtoken(string tokenVal) 
    { 


     var httpClient = new HttpClient 
     { 
      BaseAddress = new Uri(urlASM) 
     }; 
     httpClient.DefaultRequestHeaders.Accept.Clear(); 
     httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     //httpClient.DefaultRequestHeaders.Accept.Add(new Cookie("token", tokenVal)); 
     return httpClient; 
    } 

Закомментированный код один из моих Trys, чтобы это произошло. Другой общий метод, который я использую это:

public static async Task<HttpResponseMessage> PostASM(string path, object content) 
    { 
     string tokenVal = "d2GpEA5r8pwLRcOPxgaygPooldz2OZ2HUZzZ0YDPAOYCIiH4u5";    
     using (var client = CreateClientASMtoken(tokenVal)) 
     { 
      var json = JsonConvert.SerializeObject(content); 
      var serializedContent = new StringContent(json, Encoding.UTF8, "application/json"); 
      var postResponse = await client.PostAsync(path, serializedContent); 

      //string response = await postResponse.Content.ReadAsStringAsync(); 
      return postResponse; 
     } 
    } 

EDIT: Я попытался это тоже:

enter image description here

Но это показывает ошибку и URL нормально и так есть маркер. Заранее спасибо :)

ответ

0

Чтобы добавить печенье изменить строку:

//httpClient.DefaultRequestHeaders.Accept.Add(new Cookie("token", tokenVal)); 

к:

httpClient.DefaultRequestHeaders.Add("Set-Cookie", "token=test; path=/"); 

Если вы не хотите, чтобы часть пути просто идти вперед и удалить его.

Если вы хотите, чтобы иметь возможность читать куки с помощью HttpResponseMessage, вам необходимо обработать синтаксический анализ самостоятельно.

Вот способ, чтобы получить все печенье:

 HttpClient client = CreateClientASMtoken(""); 
     HttpResponseMessage response = client.GetAsync("http://localhost").Result; 

     IEnumerable<string> rawCookies = response.Headers.GetValues("Set-Cookie"); 

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

+0

Привет @FSDaniel Я попробовал ваше предложение, но не работает, а запрос в порядке, потому что я тестировал с приложением Easy REST и он работает я заменить на «httpClient.DefaultRequestHeaders.Add (» Cookie " "маркер =" + tokenVal);" и его плохой запрос (сервер отвечает на это, если файл cookie ошибочен) – Antoine

0

Я нашел способ, который решает проблему легко. Спасибо за тех, кто внес свой вклад.

public static async Task<string> GetASM(string path) 
    { 
     string tokenVal = "d2GpEA5r8pwLRcOPxgaygPooldz2OZ2HUZzZ0YDPAOYCIiH4u5"; 
     Uri uriASM = new Uri(urlASM); 
     var cookieContainer = new CookieContainer(); 
     using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
     using (var client = new HttpClient(handler) { BaseAddress = uriASM }) 
     { 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      { 
       cookieContainer.Add(uriASM, new Cookie("token", tokenVal)); 
       var getResponse = await client.GetAsync(path); 
       return await getResponse.Content.ReadAsStringAsync(); 
      } 
     } 
    }