Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浏览器只记录WCF 4.0 Cookie的第一个版本_Wcf_Rest_Cookies - Fatal编程技术网

浏览器只记录WCF 4.0 Cookie的第一个版本

浏览器只记录WCF 4.0 Cookie的第一个版本,wcf,rest,cookies,Wcf,Rest,Cookies,我正在研究使用WebHttpBinding从WCF自托管控制台应用程序REST服务编写cookie的最快方法。 我准备了“设置Cookies”,但在浏览器中只设置了第一个cookie(在Windows上使用FireFox 11.0)以及“Expires”值 我还试着在第一个cookie和第二个cookie之间加上逗号,这也不起作用: outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be

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

我还试着在第一个cookie和第二个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;" );
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端格式化内容,以使浏览器可以接受cookies

如何将所有Cookie仅第一个值插入浏览器?我错过了什么

谢谢

[编辑]

我向Microsoft寻求支持,并了解到:

在Microsoft for.NET Framework 4.0和Framework 4.5中,将“设置Cookie”插入到单个Cookie行的事实被记录为一个bug。 在Microsoft WCF开发组中,错误被列为“已关闭”和“无法修复”。

根据微软的说法,唯一的解决办法是从自托管转移到IIS内托管,然后直接使用(IIS)响应对象(不同的代码路径,没有bug)。

尽管这是一篇较旧的文章,由于这仍然是一个持续存在的问题,并且将AspNetCompatibilityMode与WCF一起使用会带来显著的性能下降,因此MSFT提供的选项在许多/大多数/任何情况下都是不可行的。我将晚些时候回答这个问题,因为这个问题仍然悬而未决

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


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

要扩展@jeff fischer的答案,AspNetCompatibilityMode可以工作,并且需要以下几点:

AspNetCompatibilityRequirements
为服务类别设置为
允许的
必需的
,例如:

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

这样就可以访问
HttpContext
(您需要
使用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标头。

提供服务配置、服务接口、服务类属性和方法属性可能会有所帮助。此外,请包括主机配置和代码。
var aCookie = new HttpCookie("foo")
{
    HttpOnly = true,
    Value = "bar",
    Expires = DateTime.Now.AddDays(1)
};

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