.NET 6.0.4中用UseWhen条件调用UseHttpsRedirection遇空引用异常求助
问题原因及解决方法
空引用异常的核心原因是HttpsRedirection中间件所需的服务未注册。在.NET 6中,UseHttpsRedirection依赖IOptions<HttpsRedirectionOptions>服务,但WebApplication.CreateBuilder默认不会自动注册该服务,直接调用会导致依赖解析失败,触发空引用。
方案一:注册HttpsRedirection服务
在构建WebApplication之前,先注册HttpsRedirection服务并配置必要选项(比如HTTPS端口),修正后的代码如下:
static void Main(string[] args) { var wab = WebApplication.CreateBuilder(args); // 注册HttpsRedirection服务,配置HTTPS端口(可从配置文件读取,这里硬编码示例) wab.Services.AddHttpsRedirection(options => { options.HttpsPort = 443; }); var wa = wab.Build(); wa.UseWhen(context => !context.Request.Path.StartsWithSegments("/exercises"), builder => { builder.UseHsts(); builder.UseHttpsRedirection(); }); wa.Run(); }
如果你的项目使用launchSettings.json配置了HTTPS端口,也可以通过配置系统自动读取,比如:
options.HttpsPort = wab.Configuration.GetValue<int>("HttpsPort");
方案二:手动实现条件重定向
如果不想依赖HttpsRedirection服务,也可以直接在中间件里手动实现HTTPS重定向逻辑,避免服务注册的问题:
static void Main(string[] args) { var wab = WebApplication.CreateBuilder(args); var wa = wab.Build(); wa.UseWhen(context => !context.Request.Path.StartsWithSegments("/exercises"), builder => { builder.UseHsts(); // 手动实现HTTPS重定向 builder.Use(async (context, next) => { if (!context.Request.IsHttps) { var httpsUrl = new UriBuilder(context.Request.Uri) { Scheme = Uri.UriSchemeHttps, Port = 443 }.ToString(); context.Response.Redirect(httpsUrl, permanent: true); return; } await next(); }); }); wa.Run(); }
内容的提问来源于stack exchange,提问作者Андрей Егоров
相关产品推荐
相关产品推荐

