从 ASP.NET 核心 6 中的服务访问 ControllerBase.Request 和 ControllerBase.Response

Access ControllerBase.Request and ControllerBase.Response from Service in ASP.NET CORE 6

如果我有一项服务 IService,它需要访问 ControllerBase 提供的请求或响应对象,就像在控制器中一样:

[HttpGet]
public async Task<IActionResult> HelloWorldAsync() {
    Response.Cookies.Append("Hello World", "Goodbye World");
    return Ok();
}

如何从服务中访问 Response?我需要注射什么?还是我需要求助于通过服务方法传递它,如下所示:

[HttpGet]
public async Task<IActionResult> HelloWorldAsync() {
    await _myService.FooWithCookies(Response);
    return Ok();
}

如果您需要 RequestResponse,那么您可以通过 ctor 注入将 IHttpContextAccessor 注入到您的服务中。

public class YourService
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public YourService(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public void SomeMethod()
    {
        var response = httpContextAccessor.HttpContext.Response;
    }
}

在您的 Startup.cs 文件中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();

    // rest is omitted for clarity.
}

在您的 ConfigureServices 代码中,您需要确保添加 HTTP 上下文访问器:

services.AddHttpContextAccessor();

然后在你的服务中你可以注入它:

public class MyService
{
    private readonly IHttpContextAccessor _contextAccessor;

    public MyService(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public async Task FooWithCookies()
    {
        HttpRequest request = _contextAccessor.HttpContext.Request;
        HttpResponse response = _contextAccessor.HttpContext.Response;
    }
}

注意 IHttpContextAccessor 注册为单例,这在某些情况下很有用。

在文档中查看更多信息:Use HttpContext from custom components


根据您的实际需要,您可能需要考虑实施自定义 IActionResult,其中包含具有以下签名的方法:

public System.Threading.Tasks.Task ExecuteResultAsync (Microsoft.AspNetCore.Mvc.ActionContext context);

这使您可以通过 ActionContext 访问上下文,还包括正在执行的特定操作的详细信息。

然后 FooWithCookies 可以 return 它(例如 return new MyActionResult(someConstructorParameter);),然后您可以简单地在操作中传递它(例如 return await _myService.FooWithCookies();)。