2016-03-11 4 views
0

我熟悉微软处理cookie生命周期的“最佳实践”(正如MSDN上定义的),并遵循这些规则,但发现了一个我需要修复的奇怪场景。我无法想象我是第一个体验到这一点的人,所以想看看社区对此的看法。更改cookie不会影响它,直到下一个请求 - 如何解决此问题?

顺便说一句,对于我将要描述的一个明显的解决办法是强制重新定向,但出于我不会考虑的原因,302不是一种选择。

好的,所以我收到一个WebRequest,并且我有一个特定的cookie。根据流程,我需要“删除”这个cookie。为此,我将响应Cookie的值设置为空,并将其到期日期设置为去年的某个时间。

但是,稍后,代码的一个非常独立的部分会尝试重新读取cookie,并猜测它是什么 - 它会查找旧值。 注意:这仍然是SAME网络请求的一部分,我们还没有返回给客户端。

当我们返回到客户端的浏览器时,cookie会被正确删除。

我的一个解决方案是,在Web请求的最初阶段,我将请求Cookie复制到单独的NameValueCollection中。

  • 每次更新cookie值时,我都会更新Response.Cookies集合中的cookie,并更新我单独的NameValueCollection中的值。
  • 每次我删除一个cookie时,我会在Response.Cookies集合中过期,然后从NameValueCollection中删除它。每当我添加一个新的cookie时,我都将它添加到Response.Cookies集合中,并将其添加到我的NameValueCollection中。
  • 每当我想要读取一个cookie的值,我从我的NameValueCollection中读取它。

想法?

感谢

格里夫

+0

这是预期的行为。由于Web请求仍在处理中,并且控件尚未返回给客户端,所以在下一个请求被触发之前,Cookie不会被移除。此外,如果您检查HttpRequest.Cookies属性的只读,这意味着一旦您收到请求,您不能修改该集合,但可以修改的是Response.Cookies和这些修改的Cookie将在下一个请求被触发时发挥作用。 –

+0

嗨Pankaj - 谢谢你的回应。所以,基于我必须处理这个事实,是否有一个首选的方法来做到这一点(除了我提到的解决方案之外)? – DrGriff

+0

因为我没有意识到确切的场景以及它的实现方式,所以我可能无法在表面层面详细判断提议的解决方案,但看起来不错。 –

回答

0

我第一次检查,如果Resonse.Cookies.AnyKeys包含我的Cookie名称。如果确实如此,那么我从Response cookies中读取。如果没有,我从Request cookies中读取数据。

相关问题