如何在ASP.NET Core的静态类中访问Cookies并实现等效代码
ASP.NET Core 废弃了原ASP.NET中 System.Web.HttpContext.Current 静态访问Http上下文的设计,要在静态类中操作Cookie,需要通过IHttpContextAccessor服务实现,具体步骤如下:
步骤1:注册IHttpContextAccessor服务
在项目的Program.cs文件中添加服务注册:
builder.Services.AddHttpContextAccessor();
步骤2:编写等价逻辑的静态类
using Microsoft.AspNetCore.Http; using System.Globalization; using System.Reflection; using System.Resources; public static class ResourceHelper { // 静态存储IHttpContextAccessor实例 public static IHttpContextAccessor HttpContextAccessor { get; set; } public static string GetString(string key) { var context = HttpContextAccessor.HttpContext; // 非请求上下文场景直接返回默认语言资源 if (context == null) { return LoadResource(key, "Fa"); } // 读取Language Cookie if (!context.Request.Cookies.TryGetValue("Language", out var langValue) || string.IsNullOrWhiteSpace(langValue)) { langValue = "Fa"; // 写入默认Cookie到响应 context.Response.Cookies.Append("Language", langValue, new CookieOptions { Expires = DateTimeOffset.Now.AddYears(1), // 可按需添加HttpOnly、Secure、Path等属性 }); } return LoadResource(key, langValue); } // 封装资源文件读取逻辑 private static string LoadResource(string key, string langCode) { ResourceManager rm = new ResourceManager($"Ippv.Virtual.Application.Properties.{langCode}", Assembly.GetExecutingAssembly()); return rm.GetString(key, CultureInfo.InvariantCulture); } }
步骤3:给静态类注入IHttpContextAccessor实例
在Program.cs完成服务构建后,添加赋值逻辑:
ResourceHelper.HttpContextAccessor = app.Services.GetRequiredService<IHttpContextAccessor>();
注意事项
- 只有在请求处理流程中调用该静态方法才能拿到有效的Http上下文,后台非请求场景下会自动返回默认波斯语资源,和原有逻辑兼容
- Cookie的配置项可根据业务安全需求调整,比如开启HttpOnly防止XSS攻击窃取Cookie
- 如果项目有整体多语言需求,也可以直接使用ASP.NET Core自带的本地化中间件,无需手动维护Cookie读取逻辑
内容的提问来源于stack exchange,提问作者Ami Bidar
相关产品推荐
相关产品推荐

