WCF 4.0 Cookie Only First由浏览器记录

时间:2012-04-19 03:22:26

标签: 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添加到浏览器的第一个值中?我错过了什么?

感谢。

[编辑]

我把这个问题提交微软寻求支持,并了解到这一点:

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

2 个答案:

答案 0 :(得分:1)

虽然这是一个较旧的帖子,因为这仍然是一个持续的问题,并且将AspNetCompatibilityMode与WCF一起使用具有显着的性能下降,MSFT提供的选项在许多/大多数/任何情况下都不可行。我将很晚才回答这个问题,因为这个问题仍然存在。

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

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请求的成功处理程序中。

答案 1 :(得分:0)

要扩展@ jeff-fischer的答案,AspNetCompatibilityMode确实有效,需要以下内容:

AspNetCompatibilityRequirements已为服务类设置为AllowedRequired,例如:

[AspNetCompatibilityRequirements(RequirementsMode
       = AspNetCompatibilityRequirementsMode.Allowed)]
public class AppService : IAppService

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />已在<system.serviceModel>

中设置

这样就可以访问HttpContext(您需要using System.Web;才能访问此内容)并且可以使用以下命令设置Cookie:

var aCookie = new HttpCookie("foo")
{
    HttpOnly = true,
    Value = "bar",
    Expires = DateTime.Now.AddDays(1)
};

HttpContext.Current.Response.Cookies.Add(aCookie);

然后,这将需要作为IIS上的应用程序运行,而不是通过WCF启动器运行,如果设置了多个cookie,实际上会出现多个cookie标头。