C# 在内容页之间遍历时,cookie值消失
在我的应用程序中。有一种登录机制,它使用刚刚登录的用户的信息保存cookieC# 在内容页之间遍历时,cookie值消失,c#,asp.net,cookies,C#,Asp.net,Cookies,在我的应用程序中。有一种登录机制,它使用刚刚登录的用户的信息保存cookie private void CreateCookie(LoginEventArgs args) { HttpCookie cookie = new HttpCookie("user"); cookie.Values["name"] = args.User_Name; cookie.Values["id"] = args.ID; c
private void CreateCookie(LoginEventArgs args)
{
HttpCookie cookie = new HttpCookie("user");
cookie.Values["name"] = args.User_Name;
cookie.Values["id"] = args.ID;
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
}
在母版页加载时,我执行检查以查看此cookie是否存在:
HttpCookie cookie = Request.Cookies["user"] ;
if( (cookie != null) && (cookie.Value != ""))
{
if (Session["user"] == null)
Login_Passed(this, new LoginEventArgs(cookie.Values["name"].ToString(), int.Parse(cookie.Values["id"])));
}
现在,如果我登录(创建cookie),请关闭浏览器并运行我的应用程序。又是饼干
存在它的值是正确的,并且用户“自动”登录
如果我首先从启动内容页重定向到其他内容页
cookies值也完好无损
问题是当我再次重定向回另一个内容页时,
母版页加载,进行检查
cookie存在,但值已删除
你知道为什么会这样吗
顺便说一句,我的注销方式可能是导致此问题的原因:
当我注销时,我创建了一个与1天前过期的cookie同名的cookie
private void Remove_Cookie()
{
HttpCookie cookie = new HttpCookie("user");
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);
}
在iv'e描述的情况下,我没有正式注销,我只是结束了我的应用程序,所以这不应该发生
没有任何影响 尝试以下操作:
- 如果你是在本地机器上开发的,请将你的应用程序放在一些免费网页上,这样就不会有“特殊待遇”,因为你在本地主机上
- 如果您已经在一个web服务器上,并且重定向在两个不同的域之间,那么您可能希望在google中搜索“同源策略”或阅读以下内容:(该文档涉及javascript,但对于Cookie也是如此)
- 好的,这个问题是不可想象的
特别感谢彼得·布朗伯格 在文章的“消失的饼干”部分 作者声明,如果您有手表,请点击Response.Cookies[“cookie\u name”] 浏览器将创建一个新的空cookie,该cookie将覆盖您的cookie 我用了这样一块手表,它使我的饼干失去了它的价值,当我把它拿下来时,饼干保持了它的价值 这句话的寓意是不要看别人的反应 我也在其他帖子上读到如果你查一下
if( Response.Cookies["cookie_name"] != null )
例如,它也会被覆盖 要重申并建立在已经陈述的基础上(是的,我知道这是一个4年前的问题),我发现最好建立一个实用程序来处理这个问题——主要是因为我想经常检查特定的cookie 这将不涉及响应,而仅从请求中读取
public static HttpCookie GetCookie(string cookieName)
{
HttpCookie rqstCookie = HttpContext.Current.Request.Cookies.Get(cookieName);
/*** NOTE: it will not be on the Response!
* this will trigger the error noted in the original question and
* create a new, empty cookie which overrides it
*
HttpCookie respCookie = HttpContext.Current.Response.Cookies.Get(cookieName);
*
*/
if (rqstCookie != null && !String.IsNullOrEmpty(rqstCookie.Value))
{
// is found on the Request
return rqstCookie;
}
else
{
return null;
}
}
经验法则
始终读取请求并写入响应
谢谢你,埃兰!这篇文章正是我所需要的使用以下方法从cookies中获取价值:
public string GetValueFromCookies(HttpCookieCollection cookies)
{
if (cookies == null)
{
throw new ArgumentNullException(nameof(cookies));
}
// check the existence of key in the list first
if (Array.IndexOf(cookies.AllKeys, key) < 0)
{
return null;
}
// because the following line adds a cookie with empty value if it's not there
return cookies[key].Value;
}
公共字符串GetValueFromCookies(HttpCookieCollection cookies)
{
如果(cookies==null)
{
抛出新的ArgumentNullException(nameof(cookies));
}
//首先检查列表中是否存在密钥
if(Array.IndexOf(cookies.AllKeys,key)<0)
{
返回null;
}
//因为下面的一行添加了一个cookie,如果它不存在,那么它的值为空
返回cookies[key].值;
}
您是否在开发人员IIS上测试此功能?我甚至不知道这是什么。这就是在Visual Studio中调试时运行的IIS服务器。因为默认情况下,它会向该服务器添加一个随机端口,而您的cookie可能依赖于该localhost:port地址,请尝试在web项目中设置一个固定端口。问题仍然存在。我认为问题在于,当我再次重定向时,会执行另一个请求,并删除最后一个请求的cookie,你知道如何在请求之间保存cookies吗?不必在母版页的每个页面上重新创建cookie。我正在本地机器上工作,请原谅我的无知,但你所说的“免费网页”是什么意思?我的意思是,你不必为托管付费。因为在开发过程中支付网络主机费是一种浪费。(不幸的是,我不知道在哪里可以找到)你可以尝试的另一件事是使用不同的浏览器。问题是cookie是否在请求之间保持活动状态,当我再次重定向它时,它是一个不同的请求,但cookie仍然存储在我的机器上,因此即使有另一个请求,它也应该被再次发送,我会在另一个浏览器上试用,让你知道不同浏览器的相同问题a getter有副作用吗?嗯,据我所知,我检查了几次只是为了确定。哥们,这太疯狂了。我快发疯了!谢谢吉米吃玉米。那太疯狂了,非常有用!适用于任何使用C#6.0以后版本的用户。下面的行可以使用,而不是整个if/else语句<代码>返回!string.IsNullOrEmpty(rqstCookie?.Value)?rqstCookie:null代码>