开门见山,系统使用cookie进行登录,今天在完善框架,增加退出功能,按理说,清除cookie然后跳回到login页面就可以了,可出现一个奇怪的现象,居然不是百分之百的回到登录,有时候会卡在主页面,不响应。
删除cookie相关的代码如下:
public void clearAll(HttpContext context)
{
context.Response.Cookies.Clear();
for (int i= 0;i < context.Request.Cookies.Count;i++)
{
HttpCookie cookie= context.Request.Cookies[i];
HttpCookie tmp_cookie = new HttpCookie(cookie.Name);
tmp_cookie.Expires = DateTime.Now.AddDays(-1);
context.Response.Cookies.Add(tmp_cookie);
}
}
有时候会出现报错:“对象的当前状态使该操作无效”
而百度查询资料说是因为 ASP.NET Request 表单域的默认长度是1000,如果是超过一千 就会出错,
要增加配置
在Web.config的appSettings加入如下配置
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="5000" />
</appSettings>
可在我自己的系统中,明明只有少数几个cookie,怎么可能会需要设置这个值呢? 于是继续跟踪调试程序代码,发现每次for循环,context.Request.Cookies.Count 这个值都在增加,是不断在变化的。
也就是说,这个循环在无限执行。所以造成了collection的长度超过了1000。
于是将上面代码修改如下
public void clearAll(HttpContext context)
{
// HttpCookieCollection collection= context.Request.Cookies;
context.Response.Cookies.Clear();
int count = context.Request.Cookies.Count;
for (int i= 0;i < count;i++)
{
HttpCookie cookie= context.Request.Cookies[i];
HttpCookie tmp_cookie = new HttpCookie(cookie.Name);
tmp_cookie.Expires = DateTime.Now.AddDays(-1);
context.Response.Cookies.Add(tmp_cookie);
}
}
这样count是不会随着 context.Request.Cookies.Count 的变化去变化了。 也就达到了删除cookie的效果,中间不会出现异常。
分享经验,自己mark一下的同时,也让大家都能受益,欢迎各位大神批评指正,联系QQ:732403040
不管是加Q,还是邮件,欢迎打扰.