gpt4 book ai didi

c# - 如何在静态类中使用 IHttpContextAccessor 设置 cookie

转载 作者:太空狗 更新时间:2023-10-30 00:04:39 26 4
gpt4 key购买 nike

我正在尝试在静态类中创建通用 addReplaceCookie 方法。该方法看起来像这样

public static void addReplaceCookie(string cookieName, string cookieValue)
{

if ((HttpContext.Current.Request.Cookies(cookieName) == null))
{
// add cookie
HttpCookie s = new HttpCookie(cookieName);
s.Value = cookieValue;
s.Expires = DateTime.Now.AddDays(7);
HttpContext.Current.Response.Cookies.Add(s);
}
else {
// ensure cookie value is correct
HttpCookie existingSchoolCookie = HttpContext.Current.Request.Cookies(cookieName);
existingSchoolCookie.Expires = DateTime.Now.AddDays(7);
existingSchoolCookie.Value = cookieValue;
HttpContext.Current.Response.Cookies.Set(existingSchoolCookie);
}

}

我知道要在 asp.net core 中获取 HttpContext,您必须使用 IHttpContextAccessor。但是我不能将它注入(inject)静态类。

还有其他方法可以访问它吗?

我正在使用 rc1-final。

最佳答案

虽然我建议远离像这样的静态类场景,但仍有可能实现您的要求。

假设一个静态类...

public class MyStaticHelperClass {
private static IHttpContextAccessor httpContextAccessor;
public static void SetHttpContextAccessor(IHttpContextAccessor accessor) {
httpContextAccessor = accessor;
}

public static void addReplaceCookie(string cookieName, string cookieValue) {
var HttpContext = httpContextAccessor.HttpContext;
if (HttpContext.Request.Cookies(cookieName) == null) {
// add cookie
HttpCookie s = new HttpCookie(cookieName);
s.Value = cookieValue;
s.Expires = DateTime.Now.AddDays(7);
HttpContext.Response.Cookies.Add(s);
} else {
// ensure cookie value is correct
HttpCookie existingSchoolCookie = HttpContext.Request.Cookies(cookieName);
existingSchoolCookie.Expires = DateTime.Now.AddDays(7);
existingSchoolCookie.Value = cookieValue;
HttpContext.Response.Cookies.Set(existingSchoolCookie);
}
}
}

您可以在 Startup.ConfigureServices 中添加访问器,因为它不再自动添加

public void ConfigureServices(IServiceCollection service) {

//Register IHttpContextAccessor and its implementation.
services.AddHttpContextAccessor();

services.AddTransient<IMyService, MyService>();
services.AddMvc();

//...
}

并通过注入(inject)Startup.Configure方法获取服务

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{
MyStaticHelperClass.SetHttpContextAccessor(accessor);

//...

}

现在完成了。我仍然强烈建议将您的静态类转换为服务,其具体实现将使用 IHttpContextAccessor 作为可以通过其构造函数注入(inject)的依赖项。

public interface ICookieService {
void AddReplaceCookie(string cookieName, string cookieValue);
}

public class CookieService : ICookieService {
IHttpContextAccessor httpContextAccessor;
public CookieService(IHttpContextAccessor httpContextAccessor) {
this.httpContextAccessor = httpContextAccessor;
}
public void AddReplaceCookie(string cookieName, string cookieValue) {
var HttpContext = httpContextAccessor.HttpContext;
if (HttpContext.Request.Cookies(cookieName) == null) {
// add cookie
HttpCookie s = new HttpCookie(cookieName);
s.Value = cookieValue;
s.Expires = DateTime.Now.AddDays(7);
HttpContext.Response.Cookies.Add(s);
} else {
// ensure cookie value is correct
HttpCookie existingSchoolCookie = HttpContext.Request.Cookies(cookieName);
existingSchoolCookie.Expires = DateTime.Now.AddDays(7);
existingSchoolCookie.Value = cookieValue;
HttpContext.Response.Cookies.Set(existingSchoolCookie);
}
}
}

...然后可以在服务集合中注册...

public void ConfigureServices(IServiceCollection service) {

services.AddHttpContextAccessor();

services.AddTransient<ICookieService, CookieService>();
services.AddMvc();
}

...并且可以注入(inject)到需要它的类中。

public class SomeClassThatNeedCookieServicesController : Controller {
ICookieService cookieService;

public SomeClassThatNeedCookieServicesController(ICookieService cookieService) {
this.cookieService = cookieService;
}

//...
}

这就是我在我的应用程序中管理 session cookie 的方式。

关于c# - 如何在静态类中使用 IHttpContextAccessor 设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com