我有一个 MVC 应用程序,它还包括一个 ASP.Net WebForm 来托管 MS ReportViewer Web 控件。我们广泛使用 WebAPI 来允许从 Knockout viewmodels 客户端发布客户端。
在这个应用程序中,我们使用 cookie 来维护一些小的用户数据——一个 GUID、一个 int 和一个 bool。
我们目前看到的是应用程序正常工作,直到用户打开 ReportViewer。那时,我们不再能够从请求标头中读取任何 cookie。这一直在几个浏览器中重现。
与 Fiddler 的检查表明 cookie 已正确发布到服务器。第一种情况,cookie值如下:
theCulture=en-US; ASP.NET_SessionId=uhmquapd1bgghpmfgy24oodf; .ASPXAUTH=6BC2F53F9CA0CF5A437998B206B564B28B5AB362153E6E0629C9142F9E3A0285494F674716A126E4632A932BCE12CE094FE590911CE5E97EA42D0C610A44D8462A15BA9A54760883DDF712B5B199C136413667954F094FEBA2A57826BC84702A4D90D7382E360594ABC2F9EBDCEE696B4662077F; special=theId=1077b59a-100d-429b-b223-f8f0508fdc27&staffingId=77096&isBackupUser=False
第二种情况,打开ReportViewer后,我们的cookies如下:
theCulture=en-US; ASP.NET_SessionId=uhmquapd1bgghpmfgy24oodf; .ASPXAUTH=6BC2F53F9CA0CF5A437998B206B564B28B5AB362153E6E0629C9142F9E3A0285494F674716A126E4632A932BCE12CE094FE590911CE5E97EA42D0C610A44D8462A15BA9A54760883DDF712B5B199C136413667954F094FEBA2A57826BC84702A4D90D7382E360594ABC2F9EBDCEE696B4662077F; special=theId=1077b59a-100d-429b-b223-f8f0508fdc27&staffingId=77096&isBackupUser=False; /Reserved.ReportViewerWebControl.axd%3FOpType%3DSessionKeepAlive%26ControlID%3Dc3b959ab1a7c42e6a9fed5d2762a8c86_SKA=1
此时我们无法再从 WebApi 中读取它们。在 WebAPI 控制器中返回 cookie 的方法是这样的:
public OurType GetApproverInfo()
{
OurType data = new OurType();
CookieHeaderValue cookie = Request.Headers.GetCookies("special").FirstOrDefault();
CookieState cookieState = cookie["special"];
data.Id = Guid.Parse(cookieState["theId"]);
data.StaffingId = Int32.Parse(cookieState["staffingId"]);
data.IsBackupUser = bool.Parse(cookieState["isBackupUser"]);
return data;
}
其他人见过这样的东西吗?
更新:我刚刚了解到在名称中创建带有前导 / 的 cookie 会导致 WebAPI 中的相同行为。