gpt4 book ai didi

c# - 如何在 ASP.NET Core 2.0 中为 IHttpcontextAccessor 使用依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 21:34:26 29 4
gpt4 key购买 nike

我想设置一个服务,将当前的 HttpContext 注入(inject)到我项目的一个类中,以便它可以管理 cookie。

我在我的 Startup.cs 类中这样设置服务:

public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddMvc();
}

如何在 C# 类中使用此服务?

我的尝试是这样的:

我的类要操作 cookie,我想注入(inject)当前的 HttpContext

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace grupoveiculos.Infraestrutura.Session
{
public class Cookie
{
private readonly IHttpContextAccessor _accessor;

public Cookie(IHttpContextAccessor accessor)
{
_accessor = accessor;
}

public void Set(string chave, string valor, int? dataExpiracao)
{
CookieOptions option = new CookieOptions();

if (dataExpiracao.HasValue)
option.Expires = DateTime.Now.AddMinutes(dataExpiracao.Value);
else
option.Expires = DateTime.Now.AddMilliseconds(10);

_accessor.HttpContext.Response.Cookies.Append(chave, valor, option);
}
}
}

但是当我尝试在 Controller 中实例化我的 Cookie 类时,它说“没有与所需的形式参数访问器对应的参数”。该错误非常合乎逻辑,它需要构造函数参数。但我希望 IHttpContextAccessor 被注入(inject),而不是我必须提供参数。

在我的 Controller 中我试过:

[HttpGet]
[Route("SelecionarIdioma")]
public IActionResult SelecionarIdioma(string cultura)
{
Cookie cookie = new Cookie(); // expecting the accessor parameter
cookie.Set("idioma", cultura, 60);

return RedirectToAction("Index", "Grupo");
}

最佳答案

这似乎是一个 XY problem .

当您已经可以在 Controller 操作中访问响应时,确实没有必要访问 IHttpContextAccessor 来访问响应

你可以创建一个扩展方法来简化事情

public static void AddCookie(this HttpResponse response, string chave, string valor, int? dataExpiracao) {
CookieOptions option = new CookieOptions();

if (dataExpiracao.HasValue)
option.Expires = DateTime.Now.AddMinutes(dataExpiracao.Value);
else
option.Expires = DateTime.Now.AddMilliseconds(10);

response.Cookies.Append(chave, valor, option);
}

并从 Controller 操作中调用它。

[HttpGet]
[Route("SelecionarIdioma")]
public IActionResult SelecionarIdioma(string cultura) {
Response.AddCookie("idioma", cultura, 60); //<-- extension method.
return RedirectToAction("Index", "Grupo");
}

关于c# - 如何在 ASP.NET Core 2.0 中为 IHttpcontextAccessor 使用依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214101/

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