2014-01-05 37 views
3

我有一個對localhost服務器的請求有問題。restsharp - 響應對象中沒有cookie

要進行身份驗證,我需要兩個cookie,一個來自sendReqForToken()方法,一個來自sendLoginReq(字符串登錄,字符串通過)。

作爲響應,我從sendLoginReq獲取cookie,但不是來自sendReqForToken()。

我不知道爲什麼一個請求有一個cookie秒沒有。

有趣的是,我從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屬性總是等於null。

這是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 
     { 
     } 
    }); 
} 

在第二個方法我得到正確的cookie。

非常感謝任何想法。

回答

3

我有同樣的問題,您的服務器向您發送一個HTTPonly = true參數的cookie,您應該將HTTOnly參數更改爲false,然後您可以從令牌響應中獲取cookie。

看到此鏈接answer to your question

+0

謝謝,我前幾天修復了這個問題。我在我的ruby服務器中將HTTPOnly參數更改爲false。現在一切都很好! – user3163231

+1

因此,我在'RestClient'中添加了一個新的'CookieContainer',然後在執行請求之後,RestClient的'CookieContainer'將會有cookie。然後我使用'GetCookieHeader()'獲取實際的cookie –

4

感謝@KarthikNishanth。要清楚:

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

var clientRestClient

client.Execute(request);GetCookieHeader()後,將返回所需的cookie

相關問題