我遇到了 ServiceStack 和 cookie 的问题 - 我无法从内置的 C# JsonServiceClient 读取或设置我的服务的 cookie。
Web 服务在 SSL 上运行在此域上:
https://sites.sub.domain.co.uk/Api/
调用服务的网站位于此处:
https://sites.sub.domain.co.uk/Website/
当我尝试在服务中设置 cookie 时,因此:
this.Response.Cookies.AddCookie(cookie);
wherecookie
的域设置为.domain.co.uk
,没有任何反应。服务完全按预期执行并返回预期响应,但未设置 cookie,也不存在异常。
我还尝试使用提供的res
对象在响应过滤器中执行此操作,结果相同。
其次,当使用 ac# 客户端调用服务时,似乎也没有发送任何 cookie。我在我的 AppHost 中注销每个请求的整个请求,
RequestFilters.Add((req, res, dto) => { Log(req.Cookies); });
并且 cookie 始终是空白的,尽管我可以在浏览器中清楚地看到存在多个 cookie,并且 fiddlerCookie
在请求中显示了一个充满内容的标题。
发出的调用是一个非常标准的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);
}
};
和 presto,浏览器中的 cookie。