2014-01-05 4 views
3

У меня проблема с одним из моих запросов на сервер localhost.restsharp - no cookie в объекте ответа

Для проверки подлинности мне нужны два куки, один из метода sendReqForToken() и один из sendLoginReq (ввод строки, строка pass).

В ответ я получаю cookie от sendLoginReq, но не от sendReqForToken().

У меня нет идеи, почему у одного запроса есть куки-секунда, нет.

Интересно, что я получаю правильный токен (содержимое ответа корректно) из метода sendReqForToken(), но без cookie в заголовке ответа.

Это метод sendReqForToken() корпус:

public void sendReqForToken() 
{ 
    string adres = Globals.TOKEN_URL;  
    RestRequest request = new RestRequest(adres, Method.GET); 

    var client = new RestClient(); 
    client.CookieContainer = new CookieContainer(); 

    client.ExecuteAsync(request, (response) => 
     { 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       var tokenValue = JsonConvert.DeserializeObject<Token.RootObject>(response.Content); 
       DataManager.Instance.authToken = tokenValue.authenticity_token; 

       if (response.Cookies.Count > 0) 
       { 
        var cookie = response.Cookies.FirstOrDefault(); 
        DataManager.Instance.cookieJar.Add(new Uri(Globals.TOKEN_URL), new Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain)); 
       } 
      } 
      else 
      { 
      } 
     }); 
} 

response.Cookies.Count всегда равно 0. Response.Cookies свойство всегда равно нулю.

Это метод sendLoginReq тела:

public void sendLoginReq(string login, string pass) 
{ 
    login = "admin"; 
    pass = "admin"; 

    string adres = Globals.LOGIN_URL; 
    RestRequest request = new RestRequest(adres, Method.POST); 
    var client = new RestClient(); 

    request.RequestFormat = DataFormat.Json; 
    try 
    { 
     request.AddBody(new 
     { 
      authenticity_token = DataManager.Instance.authToken, 
      commit = "Login", 
      utf8 = true, 
      user_session = new 
      { 
       email = login, 
       password = pass 
      } 
     }); 
    } 
    catch 
    { 
    } 

    client.ExecuteAsync(request, (response) => 
    { 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       var cookie = response.Cookies.FirstOrDefault(); 
       DataManager.Instance.cookieJar.Add(new Uri(Globals.LOGIN_URL), new Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain)); 
      } 
     } 
     else 
     { 
     } 
    }); 
} 

Во втором методе я получаю правильное печенье.

Большое спасибо за любые идеи.

ответ

3

У меня была такая же проблема, ваш сервер отправляет вам файл cookie с параметром HTTPonly = true, вы должны изменить параметр HTTOnly на false, а затем вы можете захватить cookie из ответа маркера.

эта ссылка answer to your question

+0

Спасибо, я установил этот вопрос пару дней назад. Я изменил параметр HTTPOnly на false на моем рубиновом сервере. Теперь все отлично работает! – user3163231

+1

Итак, я добавил новый 'CookieContainer' в' RestClient', а затем после выполнения запроса '' CookieContainer 'RestClient' будет иметь файл cookie. Затем я использовал 'GetCookieHeader()' для получения фактического файла cookie –

4

Благодаря @KarthikNishanth. Для того, чтобы понять:

client.CookieContainer = new CookieContainer(); 
var cookie = client.CookieContainer.GetCookieHeader(new Uri("http://domain_or_subdomain.ext")); 

var client является RestClient

После client.Execute(request); в GetCookieHeader() возвратит желаемый COOKIE

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