Servicestack - 无法从C#Client读取或设置cookie

Gre*_*ith 1 servicestack

我遇到ServiceStack和cookie的问题 - 我无法从内置的C#JsonServiceClient中读取或设置我的服务上的cookie.

Web服务正在SSL上运行在此域上:

https://sites.sub.domain.co.uk/Api/
Run Code Online (Sandbox Code Playgroud)

并且调用服务的网站位于:

https://sites.sub.domain.co.uk/Website/
Run Code Online (Sandbox Code Playgroud)

当我尝试在服务中设置cookie时,因此:

this.Response.Cookies.AddCookie(cookie);
Run Code Online (Sandbox Code Playgroud)

在哪里cookie设置域.domain.co.uk,没有任何反应.该服务完全按预期执行并返回预期的响应,但cookie未设置,并且没有异常.

我还尝试使用提供的res对象在响应过滤器中执行此操作,结果相同.

其次,当使用ac#client调用服务时,似乎没有cookie被发送.我正在AppHost的每个请求中注销整个请求,

RequestFilters.Add((req, res, dto) => { Log(req.Cookies); });
Run Code Online (Sandbox Code Playgroud)

并且cookie总是空白的,虽然我可以在浏览器中清楚地看到存在多个cookie,并且fiddler Cookie在请求中显示了满满的东西.

正在进行的调用是一个非常糟糕的标准JsonServiceClient POST请求,由aspx页面上的代码构成:

var client = new JsonServiceClient("somewhere");

var response = client.Post(new RequestForStuff());
Run Code Online (Sandbox Code Playgroud)

任何建议最受欢迎.

更新

在调查时,我通过html表单发布了一个服务,并且在我记录请求时确实有cookie集合...我希望看到的所有cookie都在那里......

另一个更新

我继续用不同的方法测试服务.在Chrome中使用REST控制台时,浏览器会发送cookie,而我正在尝试在响应上创建的cookie都正常工作,但同样,当使用相同的参数调用相同的服务时,来自ac# JsonServiceClient,既不发送也不设置cookie.

来自成功请求的头文件(来自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"
}
Run Code Online (Sandbox Code Playgroud)

从不成功的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"
}
Run Code Online (Sandbox Code Playgroud)

我在请求中玩了标题:

JsonServiceClient.HttpWebRequestFilter = f => f.Headers.Add(...
Run Code Online (Sandbox Code Playgroud)

但无济于事.

更新修复

根据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);
    }
};
Run Code Online (Sandbox Code Playgroud)

和presto,浏览器中的cookie.

paa*_*hpa 6

  • 并且cookie总是空白的,虽然我可以在浏览器中清楚地看到存在多个cookie,并且fiddler在请求中显示了满满的Cookie标题.

  • 正在进行的调用是一个非常糟糕的标准JsonServiceClient POST请求,由aspx页面上的代码构成:

上面的两条评论让我觉得当一个其他来源(即浏览器或Fiddler)发出请求时,C#客户端的请求/响应数据如何被共享(简答:它不是)可能会有一些混淆.

如果您从浏览器向page1.aspx发出请求并且后面的代码有

var client = new JsonServiceClient("somewhere");

var response = client.Post(new RequestForStuff()); 
Run Code Online (Sandbox Code Playgroud)

RequestForStuff服务中添加的任何Cookie仅添加到to client变量/ ServiceClient,而不是添加到浏览器响应中的Cookies.您实际上在请求/响应(来自浏览器)中有一个请求/响应(来自C#客户端).Cookie不会在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));           
}
Run Code Online (Sandbox Code Playgroud)