WCF 4.0饼干只有第一种是通过浏览器记录(WCF 4.0 Cookie Only First i

2019-06-23 18:30发布

我的工作以最快的方式来写从一个的WebHttpBinding WCF自托管控制台应用程序REST服务饼干。 我准备的“设置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 );

我也试图把第一个cookie,第二个,没有工作,要么之间的逗号:

outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13;, cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );

我剪下来,并发射了小提琴手:

outresp.Headers.Add( HttpResponseHeader.SetCookie , "foo=foovalue;,bar=barvalue;" );

和提琴手表明这一点:

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方面格式化的东西,使饼干接受的浏览器。

我怎样才能得到所有的饼干逼到第一个值的浏览器insetad? 我错过了什么?

谢谢。

[编辑]

我把这个问题给微软的支持,并了解到这一点:

认为“设置Cookie”是被改写的到一个单一的cookie线的事实被记录为.NET框架4.0,也框架4.5微软内部的错误。 在微软WCF开发组,错误被列为“关闭”和“不会解决”。
据微软称,唯一的解决方法是从移动自托管到IIS中托管,然后直接使用(IIS)Response对象(即不具有的bug不同的代码路径)。

Answer 1:

尽管这是一个老帖子,因为这仍是一个持续的问题,并使用与WCF的AspNetCompatibilityMode有显著的性能缺点,即MSFT已经提供的选项不是可行的在许多/大多数/任何情况。 我要迟到回答这个问题,因为这个问题仍然挥之不去。

解决这个问题的唯一办法是输出的Set-Cookie响应头就像你所展示的,而是来处理在客户端是响应头使用JavaScript,并将其放置到浏览器,因为正如你提到的,浏览器将无法处理此响应。 在这个错误我创建注意到无论是将应用一个以上的Set-Cookie响应头的工作。

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

所以,过程中的响应报头,并使用了document.cookie在客户端JavaScript放置cookies在你的jQuery阿贾克斯请求的成功处理程序中的浏览器。



Answer 2:

为了扩大对@杰夫 - 费舍尔的回答,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头实际上会出现。



文章来源: WCF 4.0 Cookie Only First is Recorded by Browser
标签: wcf rest cookies