.NET在某些情况下无法找到我在经典ASP中创建的Cookie
我是唯一支持将经典ASP和.NET混合在一起的网站的开发人员。我必须将一些.net页面添加到经典的ASP应用程序中。此应用程序需要用户登录。用经典asp编写的登录页面会创建一个cookie,.net页面将使用该cookie来识别已登录的用户,并将信息存储在会话vars中,以供其他经典asp页面使用。在经典的ASP中,Cookie代码如下:
response.cookies("foo")("value1") = value1 response.cookies("foo")("value2") = value2 response.cookies("foo").Expires = DateAdd("N", 15, Now()) response.cookies("foo").Path = "/"
在Page_Load代码后面的.NET代码中,我使用以下代码检查cookie。
if(!IsPostBack) { if(Request.Cookies["foo"] != null) { ... } else { //redirect to cookie creation page, cookiefoo.asp } }
在绝大多数情况下,此方法都不会出现问题。但是,由于Page_Load代码找不到cookie,我们有一些用户被重定向到cookie创建页面。无论用户被重定向到cookie创建页面有多少次,引用页面仍然可以找到cookie foo。该问题发生在IE7中,我尝试在浏览器中修改隐私和cookie设置,但似乎无法重现用户遇到的问题。
有谁知道为什么IE7会发生这种情况?
谢谢。
解决方案
使用Fiddler是尝试弄清正在发生什么的好方法。我们可以看到浏览器获取的确切的Set-Cookie。
跨平台Cookie测试的一般规则:将所有Cookie都转储到屏幕上,以便我们查看数据。它可能无法确切说明发生原因,但应告诉我们发生了什么。
好的第二个答案:如果这是一个很小的用户子集,则可能需要查看他们在计算机上安装了什么软件。他们的所有机器上可能都有一个通用的反间谍软件/广告软件应用程序,这些应用程序弄乱了Cookie。
如果我们无法从这些用户那里得到答案,或者没有任何怀疑,那就值得创建一个特殊的小测试脚本来编写cookie并将结果在下一次页面加载时发回给我们。
我们希望使其尽可能简单(加载链接后无用户交互),因此请执行以下操作:
- 在经典ASP中设置Cookie
- 重定向到另一个ASP页。
- 阅读Cookie并将其通过电子邮件发送给我们。
- 重定向到ASPNET页面。
- 阅读cookie并通过电子邮件发送。
我们可能也想在ASPNET中设置一个cookie,然后尝试将其读回。
如果将IE7隐私设置设置为阻止第一方Cookie,则我们发布的代码应会中断。我们在实验中尝试过吗?
Lou称Fiddler为好主意,尽管Set-Cookie响应标头不如随后的Cookie请求标头有趣,以查看客户端是否将它们转发到服务器。
我记得在我写过的一个类似的应用程序中发生了这种情况。有些页面是经典的ASP,而另一些页面则是ASP.NET。 Cookie似乎在.NET和经典ASP页面之间消失了。
IIRC,.NET端需要对Cookie进行Server.HTMLEncode / HTMLDecode。抱歉,但是我没有我使用的确切代码,但这应该可以使我们朝正确的方向前进。
关于cookie的一件很难调试的事情是,对于域,cookie区分大小写。因此,如果用户键入" www.abc.com/dir1/Alpha/",则无法从代码中访问为" www.abc.com/dir1/alpha/"发出的cookie。
在ASP.NET页面中需要注意的另一件事是
Page.Response.Redirect("~/alpha");
ASP.NET将根据实际文件路径的大小写来修改相对URL的大小写。如果目录结构中包含大小写混合的字符,请使用
Page.Response.Redirect(Page.ResolveUrl("~/alpha").ToLower());