C# ASP.NET 中 Cookie 的创建、读取与删除操作指南

方予
方予
发布时间:2026-10-14| 5人浏览过
原创

在 C# ASP.NET 开发中,Cookie 是维持用户会话状态的重要工具。本文整理了基于 System.Web 命名空间的 Cookie 基础操作,包括通过 HttpCookie 设置单一或复合(子键)数据,从请求中安全提取值,以及通过修改过期时间删除 Cookie。此外,还介绍了处理中文编码乱码和配置跨域名访问的注意事项。

核心概念与准备

在 .NET Framework (ASP.NET Web Forms/MVC) 环境下,Cookie 通过 System.Web.HttpCookie 类进行实例化和管理。所有的操作均在 HTTP 请求(Request)和响应(Response)上下文中完成。操作前需确保引用了 System.Web 命名空间。

Cookie 的基本操作

第1步:创建 Cookie(单值模式)

目的:向客户端浏览器写入一个简单的键值对 Cookie。

方法演示:

// 方法一:直接赋值属性
Response.Cookies["username"].Value = "admin";
Response.Cookies["username"].Expires = DateTime.Now.AddDays(1); // 有效期为1天

// 方法二:实例化对象后添加
System.Web.HttpCookie newCookie = new HttpCookie("username");
newCookie.Value = "oneday";
newCookie.Expires = DateTime.Now.AddDays(1);
Response.AppendCookie(newCookie); // 也可使用 Response.Cookies.Add()

第2步:创建带子键的 Cookie(集合模式)

目的:在不增加 Cookie 总数量限制的前提下,存储多个相关字段。一个主 Key 下可包含多个 Value。

System.Web.HttpCookie userCookie = new HttpCookie("user");
userCookie.Values["username"] = "admin";
userCookie.Values["password"] = "secret123";
userCookie.Expires = DateTime.Now.AddDays(1);
Response.AppendCookie(userCookie);

第3步:读取 Cookie 值

目的:从当前请求中提取已存在的 Cookie 数据。

无子键读取:

if (Request.Cookies["username"] != null)
{
    // 建议对输出内容进行 HtmlEncode 以防 XSS
    Response.Write(Server.HtmlEncode(Request.Cookies["username"].Value));
}

有子键读取:

if (Request.Cookies["user"] != null)
{
    string name = Request.Cookies["user"]["username"];
    string pass = Request.Cookies["user"]["password"];
    Response.Write(Server.HtmlEncode(name));
    Response.Write(Server.HtmlEncode(pass));
}

第4步:删除 Cookie

目的:使特定 Cookie 在客户端失效。

原理:无法直接从服务端“删除”客户端的 Cookie 文件,只能通过创建一个同名且已过期的 Cookie 来覆盖原值。

if (Request.Cookies["name"] != null)
{
    Request.Cookies["name"].Expires = DateTime.Now.AddDays(-1);
    Response.SetCookie(Request.Cookies["name"]);
}

Cookie 工具类封装示例

为了避免重复代码,通常会将上述逻辑封装为一个静态 Helper 类。该类包含了设置、读取和删除的标准实现。

using System;
using System.Web;

public class CookieHelper
{
    /// <summary>
    /// 设置 Cookie 值
    /// </summary>
    /// <param name="strName">主键名称</param>
    /// <param name="strValue">键值内容</param>
    /// <param name="strDay">有效天数</param>
    public static bool SetCookie(string strName, string strValue, int strDay)
    {
        try
        {
            HttpCookie cookie = new HttpCookie(strName);
            // 如需跨域名共享,取消下方注释并填写域名,如 ".example.com"
            // cookie.Domain = ".xxx.com";
            
            cookie.Expires = DateTime.Now.AddDays(strDay);
            cookie.Value = strValue;
            HttpContext.Current.Response.Cookies.Add(cookie);
            return true;
        }
        catch
        {
            return false;
        }
    }

    /// <summary>
    /// 读取 Cookie 值
    /// </summary>
    /// <param name="strName">主键名称</param>
    public static string GetCookie(string strName)
    {
        HttpCookie cookie = HttpContext.Current.Request.Cookies[strName];
        if (cookie != null)
        {
            return cookie.Value.ToString();
        }
        return null;
    }

    /// <summary>
    /// 删除指定 Cookie
    /// </summary>
    /// <param name="strName">主键名称</param>
    public static bool DelCookie(string strName)
    {
        try
        {
            HttpCookie cookie = new HttpCookie(strName);
            // 需保持与 SetCookie 相同的 Domain 设置(如果有)
            // cookie.Domain = ".xxx.com";
            
            cookie.Expires = DateTime.Now.AddDays(-1);
            HttpContext.Current.Response.Cookies.Add(cookie);
            return true;
        }
        catch
        {
            return false;
        }
    }
}

使用示例与常见问题

基本调用示例

CookieHelper.SetCookie("name", "value", 1);
string val = CookieHelper.GetCookie("name");
CookieHelper.DelCookie("name");

注意:中文乱码问题

如果在 Cookie 中存储中文字符,部分旧版浏览器或配置可能会导致乱码。建议在设置时进行 URL 编码,读取后进行解码:

// 设置时编码
CookieHelper.SetCookie("desc", Server.UrlEncode("测试中文"), 1);

// 读取时解码
string decodedVal = HttpUtility.UrlDecode(CookieHelper.GetCookie("desc"));

关于生命周期

如果创建 Cookie 时不指定 Expires 属性,该 Cookie 将成为“会话 Cookie”,仅在内存中存在。当用户关闭浏览器标签页或整个浏览器时,该 Cookie 将自动失效,不会保存到磁盘上。

跨域访问提示

默认情况下,Cookie 只能被其创建的域名下的页面访问。若需在子域名之间共享 Cookie(如从 a.example.com 读取 b.example.com 设置的 Cookie),必须在创建时显式指定 Domain 属性为父域名(如 ".example.com")。删除时也需保持该设置一致,否则无法覆盖。

以上就是 C# ASP.NET 中 Cookie 创建、读取和删除操作的详细内容,更多关于 .NET Web 开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。