2

我有一个 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 中的相同行为。

4

1 回答 1

0

我看到的是ReportView弄乱了cookie。可能您正在某个地方设置cookieWebApi ,该 cookie的管道执行顺序与ReportView Handle.

下面是 WebApi 生命周期:ASP.NET WEB API:HTTP MESSAGE LIFECYLE

但是,您可以使用 覆盖ReportViewerServerConnectionIReportServerConnection并保留您的cookie模式。

看看这里:ReportViewer 的 Web.config 设置

另一种方法应该是在 Custom中设置cookieIHttpModule,集成到 ASP.NET 管道中,然后同时定位两者,WebApi并且ReportView

于 2013-09-16T17:21:19.307 回答