虽然我建议远离这样的静态类场景,但仍然可以实现您所要求的目标。
假设像这样的静态类...
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();
//...
}
并通过注入来获取服务Startup.Configure
method
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{
MyStaticHelperClass.SetHttpContextAccessor(accessor);
//...
}
现在完成了。我仍然强烈建议将您的静态类转换为一个服务,其具体实现将使用IHttpContextAccessor
作为可以通过其构造函数注入的依赖项。
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();
}
...并且可以注入到需要使用它的类中。
public class SomeClassThatNeedCookieServicesController : Controller {
ICookieService cookieService;
public SomeClassThatNeedCookieServicesController(ICookieService cookieService) {
this.cookieService = cookieService;
}
//...
}
这就是我在应用程序中管理会话 cookie 的方法。