我正在研究使用 WebHttpBinding 从 WCF 自托管控制台应用程序 REST 服务写入 cookie 的最快方法。我准备了“设置 Cookie”,但仅在浏览器中设置了第一个 Cookie(在 Windows 上使用 FireFox 11.0)以及“过期”值。
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 );
Run Code Online (Sandbox Code Playgroud)
我还尝试在第一个 cookie 和第二个 cookie 之间添加逗号,但这也不起作用:
outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13;, cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );
Run Code Online (Sandbox Code Playgroud)
我把它剪下来,然后启动 Fiddler:
outresp.Headers.Add( HttpResponseHeader.SetCookie , "foo=foovalue;,bar=barvalue;" );
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这告诉我,我没有在 .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 响应标头,就像您所显示的那样,但要使用 javascript 在客户端处理该响应标头并将其放入浏览器中,因为正如您所指出的,浏览器不会处理此响应。正如我创建的这个错误中所述,应用多个 Set-Cookie 响应标头也不会起作用。
因此,处理响应标头并在客户端 javascript 中使用 document.cookie 将 cookie 放置在浏览器中 jQuery .ajax 请求的成功处理程序中。
| 归档时间: |
|
| 查看次数: |
3311 次 |
| 最近记录: |