use*_*671 4 c# cookies asp.net-core-mvc .net-core asp.net-core
我试图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);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道为了获得HttpContext
asp.net核心,你必须使用IHttpContextAccessor
.但我无法将其注入静态类.
有没有其他方法可以访问它?
我正在使用rc1-final.
Nko*_*osi 12
虽然我建议远离这样的静态类场景,但仍然可以实现你所要求的.
在该Startup.ConfigureServices
方法中,你可以调用services.BuildServiceProvider()
得到IServiceProvider
解决您寻找的类型.这有点像黑客,但它的工作原理.
假设像...这样的静态类
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在启动期间配置您的课程
public IServiceProvider ConfigureServices(IServiceCollection service) {
services.AddTransient<IMyService, MyService>();
services.AddMvc();
//this would have been done by the framework any way after this method call;
//in this case you call the BuildServiceProvider manually to be able to use it
var serviceProvider = services.BuildServiceProvider();
//here is where you set you accessor
var accessor = serviceProvider.GetService<IHttpContextAccessor>()
MyStaticHelperClass.SetHttpContextAccessor(accessor);
return serviceProvider;
}
Run Code Online (Sandbox Code Playgroud)
现在完成了.我仍然强烈建议将静态类转换为一个服务,其具体实现将使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
...然后可以在服务集合中注册......
public void ConfigureServices(IServiceCollection service) {
services.AddTransient<ICookieService, CookieService>();
services.AddMvc();
}
Run Code Online (Sandbox Code Playgroud)
...并且可以注入需要使用它的类.
public class SomeClassThatNeedCookieServicesController : Controller {
ICookieService cookieService;
public SomeClassThatNeedCookieServicesController(ICookieService cookieService) {
this.cookieService = cookieService;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在应用程序中管理会话cookie的方法.
归档时间: |
|
查看次数: |
4691 次 |
最近记录: |