【问题标题】:Reading/Writing Cookies读/写 Cookie
【发布时间】:2017-02-04 15:59:59
【问题描述】:

我今天加入了这个网站,希望有人能善意地向我解释我在 ASP.NET 中使用 cookie 的问题。 如果我的问题太基本,我仍在学习,但我在谷歌上找不到答案。我找到的每个答案都显示了我已经拥有的代码。

我正在尝试创建和读取 cookie,我已将此代码放入我的应用程序构造函数中。这就是我尝试初始化我的 cookie 并将其添加到浏览器的方式。

global.asax.cs

    public MyApplication()
    {
        myCookie = new HttpCookie("UserSettings");
        myCookie.Value = "nl";
        myCookie.Expires = DateTime.Now.AddDays(1d);
        Response.Cookies.Add(myCookie);
    }

HomeController.cs 中的一个方法(试图读取 cookie)

    public void setLang(string lang)
    {
        HttpCookie myCookie = Request.Cookies["UserSettings"];
        myCookie.Value = lang;
        //rest of method

我在 Response.Cookies.Add(myCookie); [HttpException (0x80004005): 响应在此上下文中不可用。]

我的想法是我可能忘记导入命名空间或其他东西,但我似乎没有解决这个错误,谁能指出我正确的方向?

【问题讨论】:

  • 请看这个问题的答案:stackoverflow.com/questions/1790457/…
  • 我认为这篇文章更多的是关于从当前上下文中读取 cookie 对吧?我的错误是将 cookie 添加到浏览器。
  • 那篇文章是关于 Response 对象在这一点上不可用的事实,在某些情况下,这似乎是你的问题。
  • 啊,现在我有了答案,我明白那篇文章与我的错误有何关系。

标签: c# asp.net cookies


【解决方案1】:

您不能使用 Global.asax 构造函数将 cookie 添加到响应,因为 Global.asax 构造函数在应用程序开始处理 HTTP 请求之前被调用。

将您的代码从 Global.asax 构造函数移至 Application_BeginRequest 方法:

public void Application_BeginRequest()
{
    myCookie = new HttpCookie("UserSettings");
    myCookie.Value = "nl";
    myCookie.Expires = DateTime.Now.AddDays(1d);
    Response.Cookies.Add(myCookie);
}

Global.asax 有许多不同的事件被触发,你只是选择错误。

  • Application_Init:在应用程序第一次初始化时触发。
  • Application_Start:在应用程序第一次启动时触发。
  • Session_Start:用户会话第一次启动时触发。
  • Application_BeginRequest:每次有新请求进来时触发。
  • Application_EndRequest:请求结束时触发。
  • Application_AuthenticateRequest:表示请求已准备好进行身份验证。
  • Application_Error:当应用程序中发生未处理的错误时触发。
  • Session_End:当单个用户会话结束或超时时触发。
  • Application_End:当应用程序结束或超时时触发(通常用于应用程序清理逻辑)。

(来自http://en.wikipedia.org/wiki/Global.asax

【讨论】:

  • 就在这里。我还在应用程序启动事件中测试您的代码并得到相同的错误,但是当您在 Begin_Request 上使用它时它可以工作
  • 这也可能有助于您更好地了解 .NET Web App 生命周期msdn.microsoft.com/en-us/library/bb470252.aspx#Stages
  • 啊,非常有用的答案,我不知道。您的解决方案消除了错误,非常感谢!
  • 通过声明 myCookie 来改进您的答案,并展示如何在无需向上滚动到问题的情况下读取 cookie。谢谢。
【解决方案2】:

cookies 是存储在客户端计算机上的一小段信息。该文件位于客户端机器上。它用于在客户端机器上存储用户偏好信息,如用户名、密码、城市和电话号码等。在使用 cookie 之前,我们需要导入名为 Systen.Web.HttpCookie 的命名空间。

Cookie 的类型? Persist Cookie - 一个 cookie 没有过期,称为 Persist Cookie

Non-Persist Cookie - A cookie has expired time Which is called as Non-Persist Cookie 

如何创建cookie?

借助 Response 对象或 HttpCookie 在 Asp.Net 中创建 cookie 真的很容易

    HttpCookie userInfo = new HttpCookie("userInfo");
    userInfo["UserName"] = "Jishan siddique";
    userInfo["UserColor"] = "Black";
    userInfo.Expires.Add(new TimeSpan(0, 1, 0));
    Response.Cookies.Add(userInfo);

【讨论】:

    【解决方案3】:

    Cookie的共同属性:

    1.Domain => Which is used to associate cookies to domain.
    
    2.Secure  => We can enable secure cookie to set true(HTTPs).
    
    3.Value    => We can manipulate individual cookie.
    
    4.Values  => We can manipulate cookies with key/value pair.
    
    5.Expires => Which is used to set expire date for the cookies. 
    

    Cookie 的优点:

    1.Its clear text so user can able to read it.
    
    2.We can store user preference information on the client machine.
    
    3.Its easy way to maintain.
    
    4.Fast accessing.
    

    Cookie 的缺点

    1.If user clear cookie information we can't get it back.
    
    2.No security.
    
    3.Each request will have cookie information with page. 
    

    如何清除cookie信息?

    1.我们可以从cookie文件夹中清除客户端机器上的cookie信息

    2.设置cookie对象的过期时间 userInfo.Expires = DateTime.Now.AddHours(1); 它将清除持续一小时的cookie

    【讨论】:

      【解决方案4】:

      您可以在 .Net 中使用预定义的命名空间。像这样:

      System.Web.HttpContext.Current.Response.addCookie(cookieobject);
      

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 2011-06-25
        • 2018-11-11
        • 2011-10-08
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        相关资源
        最近更新 更多