如何在static class中使用IHttpContextAccessor来设置cookie
How to use IHttpContextAccessor in static class to set cookies
我正在尝试在静态 class 中创建通用 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 核心中获得 HttpContext
,您必须使用 IHttpContextAccessor
。但是我不能将它注入静态 class.
还有其他方法可以访问它吗?
我正在使用 rc1-final。
如果可能,不要使用static class
。但是如果你必须使用,发送 IHttpContextAccessor
作为参数可能是一个解决方案。
public static void addReplaceCookie(string cookieName, string cookieValue, IHttpContextAccessor accessor)
{
//your code
}
public class CallerClass
{
private readonly IHttpContextAccessor _accessor;
public CallerClass(IHttpContextAccessor accessor)
{
_accessor = accessor;
addReplaceCookie(cookieName, cookieValue, accessor);
}
}
虽然我建议远离像这样的静态 class 场景,但仍有可能实现您的要求。
假设静态 class 比如...
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
方法获得服务
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{
MyStaticHelperClass.SetHttpContextAccessor(accessor);
//...
}
现在完成了。我仍然强烈建议将您的静态 class 转换为服务,其具体实现将使用 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();
}
...并可用于注入需要它的 classes。
public class SomeClassThatNeedCookieServicesController : Controller {
ICookieService cookieService;
public SomeClassThatNeedCookieServicesController(ICookieService cookieService) {
this.cookieService = cookieService;
}
//...
}
这就是我在我的应用程序中管理会话 cookie 的方式。
在Startup.ConfigureServices中:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
稍后在 Startup.Configure 中通过 DI IServiceProvider 添加并使用它来提取 IHttpContextAccessor,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider svp)
{
IHttpContextAccessor accessor = svp.GetService<IHttpContextAccessor>();
MyRepository.SetHttpContextAccessor(accessor);
我正在尝试在静态 class 中创建通用 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 核心中获得 HttpContext
,您必须使用 IHttpContextAccessor
。但是我不能将它注入静态 class.
还有其他方法可以访问它吗?
我正在使用 rc1-final。
如果可能,不要使用static class
。但是如果你必须使用,发送 IHttpContextAccessor
作为参数可能是一个解决方案。
public static void addReplaceCookie(string cookieName, string cookieValue, IHttpContextAccessor accessor)
{
//your code
}
public class CallerClass
{
private readonly IHttpContextAccessor _accessor;
public CallerClass(IHttpContextAccessor accessor)
{
_accessor = accessor;
addReplaceCookie(cookieName, cookieValue, accessor);
}
}
虽然我建议远离像这样的静态 class 场景,但仍有可能实现您的要求。
假设静态 class 比如...
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
方法获得服务
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{
MyStaticHelperClass.SetHttpContextAccessor(accessor);
//...
}
现在完成了。我仍然强烈建议将您的静态 class 转换为服务,其具体实现将使用 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();
}
...并可用于注入需要它的 classes。
public class SomeClassThatNeedCookieServicesController : Controller {
ICookieService cookieService;
public SomeClassThatNeedCookieServicesController(ICookieService cookieService) {
this.cookieService = cookieService;
}
//...
}
这就是我在我的应用程序中管理会话 cookie 的方式。
在Startup.ConfigureServices中:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
稍后在 Startup.Configure 中通过 DI IServiceProvider 添加并使用它来提取 IHttpContextAccessor,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider svp)
{
IHttpContextAccessor accessor = svp.GetService<IHttpContextAccessor>();
MyRepository.SetHttpContextAccessor(accessor);