【问题标题】:Servicestack - cannot read or set cookies from C# ClientServicestack - 无法从 C# 客户端读取或设置 cookie
【发布时间】:2013-04-09 19:52:25
【问题描述】:

我在使用 ServiceStack 和 cookie 时遇到问题 - 我无法从内置的 C# JsonServiceClient 读取或设置我的服务的 cookie。

网络服务正在 SSL 上运行,在此域上:

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

调用服务的网站位于此处:

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

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

this.Response.Cookies.AddCookie(cookie);

如果cookie 设置为.domain.co.uk 域,则没有任何反应。服务完全按预期执行并返回预期响应,但没有设置 cookie,也没有异常。

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

其次,当使用 c# 客户端调用服务时,似乎也没有发送任何 cookie。我在我的 AppHost 中注销每个请求的整个请求,

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

虽然我可以在浏览器中清楚地看到存在多个 cookie,但 cookie 始终是空白的,并且 fiddler 会在请求中显示一个 Cookie 标头。

正在发出的调用是一个非常标准的JsonServiceClient POST 请求,由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);
    }
};

然后,浏览器中的 cookie。

【问题讨论】:

  • cookie.Secure = true 吗?
  • 不——回想起来的弱问题

标签: servicestack


【解决方案1】:
  • 虽然我在浏览器中可以清楚地看到有几个 cookie 存在,但 cookie 始终是空白的,并且 fiddler 在请求中显示了一个 Cookie 标头,里面装满了东西。

  • 发出的调用是一个非常标准的 JsonServiceClient POST 请求,由 aspx 页面上的代码发出:

上面的 2 个 cmets 让我觉得当从其他来源(即浏览器或 Fiddler )。

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

var client = new JsonServiceClient("somewhere");

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

在 RequestForStuff 服务中添加的任何 Cookie 仅添加到 client 变量/ServiceClient 中,添加到响应浏览器的 Cookie 中。您本质上在请求/响应(来自浏览器)中有一个请求/响应(来自 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));           
}

【讨论】:

  • 感谢 cmets,是的,这是有道理的。根据您的说法,当从另一个请求/响应上下文中的 c# 客户端调用服务时,我正在浪费时间尝试在服务上设置 cookie,是吗?
  • 几乎是的...但是,您不会浪费时间,因为使用 ServiceStack 的时间永远不会浪费时间 :) - 但是,您要查找的 cookie 永远不会在“外部”中' 上下文,除非您将它们从 C# 客户端中取出并放在那里。
  • 是的 - 现在对此进行了测试并得到了解决方案。感谢 paaschpa 的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多