从 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();
}
如果您需要 Request
或 Response
,那么您可以通过 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();
)。
如果我有一项服务 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();
}
如果您需要 Request
或 Response
,那么您可以通过 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();
)。