如何在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);