2013-04-09 69 views
1

我遇到了ServiceStack和Cookie問題 - 我無法從內置的C#JsonServiceClient中讀取,也無法在我的服務上設置Cookie。Servicestack - 無法從C#中讀取或設置Cookie客戶端

web服務正在運行,對SSL,在這個領域:

https://sites.sub.domain.co.uk/Api/ 

和網站調用服務位於:

https://sites.sub.domain.co.uk/Website/ 

當我試圖設置一個cookie的服務,從而:

this.Response.Cookies.AddCookie(cookie); 

其中cookie被設定爲的域,沒有任何反應。服務完全按預期執行,並返回預期的響應,但未設置cookie,並且沒有異常。

我也試圖在響應過濾器中使用提供的res對象執行此操作,並得到相同的結果。

其次,當使用c#客戶端調用服務時,不會發送任何cookie。我退出每個請求的整個請求,在我APPHOST,

RequestFilters.Add((req, res, dto) => { Log(req.Cookies); }); 

和餅乾總是空白,但我可以明確地在瀏覽器中看到,有一些餅乾存在,並且小提琴手顯示Cookie頭上滿是請求的東西。

所發出的呼籲是非常沼澤標準JsonServiceClientPOST要求,從代碼的aspx頁面上進行後面:

var client = new JsonServiceClient("somewhere"); 

var response = client.Post(new RequestForStuff()); 

任何建議深受歡迎。

更新

在調查中,我叫通過HTML表單提交的服務之一,這確實有由當時的Cookie集合我登錄的請求......我」的所有Cookie ð希望看到的是有...

另一個更新

我繼續用不同的方式測試服務。在Chrome中使用REST控制檯時,Cookie由瀏覽器發送,並且我試圖在響應中創建的Cookie都正常工作,但同樣使用相同參數調用相同服務時,來自ac# JsonServiceClient,cookies既不發送也不設置。

從成功的請求的標頭(來自REST控制檯)(序列化JSON在日誌文件中):

{ 
    "Header": "Connection", 
    "Value": "keep-alive" 
}, 
{ 
    "Header": "Content-Length", 
    "Value": "124" 
}, 
{ 
    "Header": "Content-Type", 
    "Value": "application/json" 
}, 
{ 
    "Header": "Accept", 
    "Value": "application/json" 
}, 
{ 
    "Header": "Accept-Charset", 
    "Value": "ISO-8859-1,utf-8;q=0.7,*;q=0.3" 
}, 
{ 
    "Header": "Accept-Encoding", 
    "Value": "gzip,deflate,sdch" 
}, 
{ 
    "Header": "Accept-Language", 
    "Value": "en-GB,en-US;q=0.8,en;q=0.6" 
}, 
{ 
    "Header": "Cookie", 
    "Value": massive load of stuff... 
}, 
{ 
    "Header": "Host", 
    "Value": "sites.sub.domain.co.uk" 
}, 
{ 
    "Header": "User-Agent", 
    "Value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31" 
}, 
{ 
    "Header": "Origin", 
    "Value": "chrome-extension://cokgbflfommojglbmbpenpphppikmonn" 
} 

而且從失敗的C#客戶端調用:

{ 
    "Header": "Content-Length", 
    "Value": "124" 
}, 
{ 
    "Header": "Content-Type", 
    "Value": "application/json" 
}, 
{ 
    "Header": "Accept", 
    "Value": "application/json" 
}, 
{ 
    "Header": "Accept-Encoding", 
    "Value": "gzip,deflate,gzip, deflate" 
}, 
{ 
    "Header": "Expect", 
    "Value": "100-continue" 
}, 
{ 
    "Header": "Host", 
    "Value": "sites.sub.domain.co.uk" 
} 

我打過關於請求上的標題:

JsonServiceClient.HttpWebRequestFilter = f => f.Headers.Add(... 

但無濟於事。

更新與修復

繼從paacshpa答案,我把這個代碼在客戶端:

JsonServiceClient.HttpWebResponseFilter = d => 
{ 
    foreach (Cookie co in d.Cookies) 
    { 
     var htc = new HttpCookie(co.Name, co.Value) { Domain = co.Domain, Path = "/" }; 
     HttpContext.Current.Response.Cookies.Add(htc); 
    } 
}; 

和急,餅乾在瀏覽器中。

+0

Does cookie.Secure = true? – jeffgabhart 2013-04-09 20:00:23

+0

不 - 應該嗎? – 2013-04-09 20:01:06

+0

Nah - 回想起來很弱的問題 – jeffgabhart 2013-04-09 20:16:22

回答

6
  • 和餅乾總是空白,雖然我可以在瀏覽器中清楚地看到,有幾個餅乾禮物,並且小提琴手顯示Cookie頭充滿了對請求的東西。

  • 所發出的呼籲是非常沼澤標準JsonServiceClient POST請求,從代碼做後面的aspx頁面上:

2.上述評論,讓我覺得可能會有一些混淆了C#客戶端的請求/響應數據如何被共享(簡短回答:它不是),當請求從其他源(如瀏覽器或提琴手)發出時。

如果您從一個瀏覽器的請求Page1.aspx的和後面的代碼有

var client = new JsonServiceClient("somewhere"); 

var response = client.Post(new RequestForStuff()); 

在RequestForStuff服務添加任何cookie只被添加到到client變量/ ServiceClient和到瀏覽器響應中的Cookies。您實質上在請求/響應(來自瀏覽器)中有一個請求/響應(來自C#客戶端)。 Cookies不在2'互動'之間共享。

您可以將Cookie從client變量中取出,並將它們添加到原始請求的響應中。

foreach(Cookie c in client.CookieContainer.GetCookies(newUri("https://sites.sub.domain.co.uk"))) 
{ 
    HttpContext.Current.Response.AppendCookie(new HttpCookie(c.Name, c.Value));   
} 
+0

感謝您的評論,是的,這是有道理的。從你所說的話,我正在浪費自己的時間,試圖在服務中調用來自另一個請求/響應環境中的c#客戶端的cookie時,是的? – 2013-04-10 12:16:46

+0

幾乎是的......但是,你並沒有浪費時間,因爲使用ServiceStack的時間永遠不會浪費時間:) - 但是,你所尋找的cookies永遠不會在'外部'的環境中,除非你把它們拿出來的C#客戶端,並把它們放在那裏。 – paaschpa 2013-04-10 14:28:13

+0

是的 - 現在測試這個並得到了一個解決方案。感謝幫助paaschpa。 – 2013-04-10 15:20:58