【问题标题】:Replace the injected HttpContext for class in application为应用程序中的类替换注入的 HttpContext
【发布时间】:2023-02-09 16:01:42
【问题描述】:
我正在使用 xunit、respawn 和 webapplicationfactory 为 mediatr 处理程序设置一些集成测试....
正在测试的 mediatr 处理程序最终调用的类之一.. 具有对 IHttpContextAccessor 的依赖性,如下所示
我觉得我已经设置了我想要正确注入的“替换”单例,如下所示:
但是当集成测试运行时.. httpContextAccessor 不为空,但 HttpContext 始终为空。
我已经尝试了大约 600 万件事 :( 非常悲伤。
如何让 IHttpContextAccessor 正确解析为我在 ConfigureServices 中设置的内容?
【问题讨论】:
标签:
asp.net-core
dependency-injection
asp.net-core-3.1
httpcontext
mediatr
【解决方案1】:
当集成测试运行时.. httpContextAccessor 不为空,但 HttpContext 始终为空。如何让 IHttpContextAccessor 正确解析为我的内容
在配置服务中设置?
不,我们不能,HttpContext 将仅在请求范围内可用,因为 ConfigureServices 在构造 Startup 之前调用,因此如果我们尝试注入,它将通过异常,即使我们在该场景中声明全局变量,它也将始终为 null。应用程序启动只发生一次,并且在收到任何请求之前很久。
因此,ConfigureServices 在任何 httprequest 到达应用程序之前运行一次。如果我们强行尝试在请求生命周期之外调用它,它将始终以 NullReferenceException 结束。你可以get more details in the official document.