WCF 4.0 Cookie 只有第一个被浏览器记录

标签 wcf rest cookies

我正在研究使用 WebHttpBinding 从 WCF 自托管控制台应用程序 REST 服务编写 cookie 的最快方法。
我准备了“Set Cookies”,但在浏览器中只设置了第一个 cookie(在 Windows 上使用 FireFox 11.0)以及“Expires”值。

var expiry = DateTime.Now.AddMonths( 6 );
var outresp = WebOperationContext.Current.OutgoingResponse;
outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13; cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );

我还尝试在第一个 cookie 和第二个 cookie 之间加一个逗号,这也不起作用:
outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13;, cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );

我减少了这个,然后启动了 Fiddler:
outresp.Headers.Add( HttpResponseHeader.SetCookie , "foo=foovalue;,bar=barvalue;" );

和 Fiddler 显示了这一点:
Response sent 27 bytes of Cookie data:
    Set-Cookie: foo=foovalue;,bar=barvalue;

This response did not contain a P3P Header.

Validate P3P Policies at: http://www.w3.org/P3P/validator.html
Learn more at: http://www.fiddler2.com/redir/?id=p3pinfo

这告诉我我没有在 .NET 端格式化东西以使浏览器可以接受 cookie。

如何将所有 cookie 放入仅第一个值的浏览器中?我错过了什么?

谢谢。

[ 编辑 ]

我将此问题提交给 Microsoft 寻求支持,并了解到:

“Set-Cookie”被写入单个 cookie 行这一事实在 Microsoft 中被记录为 .NET Framework 4.0 和 Framework 4.5 的错误。
在 Microsoft WCF 开发组中,该错误被列为“已关闭”和“无法修复”。
根据 Microsoft 的说法,唯一的解决方法是从自托管转移到 IIS 内托管,然后直接使用 (IIS) 响应对象(没有错误的不同代码路径)。

最佳答案

尽管这是一篇较旧的帖子,但由于这仍然是一个持续存在的问题,并且将 AspNetCompatibilityMode 与 WCF 结合使用具有显着的性能下降,因此 MSFT 提供的选项在许多/大多数/任何情况下都不可行。由于这个问题仍然挥之不去,我将迟到回答这个问题。

解决此问题的唯一方法是像您显示的那样输出 Set-Cookie 响应 header ,但在客户端使用 javascript 处理该响应 header 并将其放入浏览器,因为正如您所指出的,浏览器不会处理这个响应。如我创建的这个错误中所述,应用多个 Set-Cookie 响应 header 也不会起作用。

http://connect.microsoft.com/VisualStudio/feedback/details/779111/wcf-rest-service-two-set-cookie-http-headers-invalid-set-cookie-header-syntax

因此,处理响应头并在客户端 javascript 中使用 document.cookie 将 cookie 放置在浏览器中 jQuery .ajax 请求的成功处理程序中。

关于WCF 4.0 Cookie 只有第一个被浏览器记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221211/

相关文章:

azure - 如何使用rest将.csv文件放入存储帐户?

javascript - 设置cookie并自动登录

wcf - WCF 服务库和 WCF 服务应用程序之间的区别

jquery - 需要帮助让 getJSON 通过 SSL 工作

WCF用户名身份验证和故障契约(Contract)

java - 使用 Genson 和 Jersey 解析 POST 中的 JSON 日期

.net - 如何处理 WCF 的 MSMQ 绑定(bind)中的消息失败

javascript - 如何在 RESTful 系统中使用 HTTP GET 请求传递授权数据?

cookies - Casperjs 登录 : Does casperjs manage cookies?

javascript - 如何设置具有两个不同到期日期的多个值