2013-04-09 93 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