为何在VS调试模式下无需注册即可解析IHttpContextAccessor?
问题
我拥有一个基于默认WebAPI模板创建的简单.NET Core Web API应用程序,其Startup注册类为默认实现:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); ... } }
请问为何在Visual Studio调试模式下无需注册即可解析IHttpContextAccessor?
解答
这个问题其实和开发环境下启用的开发者异常页面中间件直接相关,我来给你拆解背后的逻辑:
- 首先要明确:.NET Core 框架默认不会自动注册
IHttpContextAccessor服务。在常规场景下,你必须手动调用services.AddHttpContextAccessor(),才能在应用中通过依赖注入获取它的实例。 - 但在调试模式(也就是
env.IsDevelopment()返回true)时,你的代码启用了app.UseDeveloperExceptionPage()中间件。这个中间件的核心作用是在发生异常时展示包含详细请求上下文、堆栈跟踪等信息的错误页面,而它本身的运行依赖IHttpContextAccessor来获取当前请求的上下文数据。 - 为了满足自身的依赖需求,
UseDeveloperExceptionPage()方法在执行过程中,会自动向服务容器中注册IHttpContextAccessor的实现类HttpContextAccessor。这相当于框架替你完成了手动注册的步骤。 - 这就解释了为什么调试模式下不用手动注册也能解析到
IHttpContextAccessor:一旦你启用了开发者异常页面,框架就会偷偷帮你注册这个服务。但如果切换到生产环境(关闭开发者异常页面),或者移除app.UseDeveloperExceptionPage()的调用,此时如果没有显式添加services.AddHttpContextAccessor(),尝试注入IHttpContextAccessor就会立刻抛出「服务未注册」的异常。
内容的提问来源于stack exchange,提问作者Alexander I.
相关产品推荐
相关产品推荐

