.Net Core WebApi项目 Development模式下报错 System.InvalidOperationException 解决记录
.Net Core WebApi项目 Development模式下报错
System.InvalidOperationException:“Cannot resolve scoped service 'Microsoft.Extensions.Options.IOptionsSnapshot`1[Infrastructure.OptionsSetting]' from root provider.”
但是在Production模式下,运行正常
因为未设置的话,.net core会运行在Production模式
而Production模式下
options.ValidateScopes 默认值为false,
所以当启用
options.ValidateScopes = true;的时候
也可以看到该错误.
解决方法
1
最简单的解决方法,就是直接设置为
options.ValidateScopes = false,但这属于自欺欺人的感觉,屏蔽了错误提示而已.要求不高也可以,
2
IOptionsSnapshot改成IOptionsMonitor
-
IOptionsSnapshot:
- 生命周期:作用域服务(Scoped Service),每个作用域内都有一个实例。
- 适用情况:适合需要动态配置并且根据请求或环境变化的情况,例如用户首选项或动态配置。
-
IOptionsMonitor:
- 生命周期:单例服务(Singleton Service),应用程序生命周期内只有一个实例。
- 适用情况:适合静态配置或者不需要在每个请求范围内改变的配置
错误引发原因
全局注册了Options配置文件导致
/// <summary> /// 用于全局注入配置文件 /// </summary> public class OptionsMiddleware { private readonly RequestDelegate next; private readonly IOptionsSnapshot<OptionsSetting> _options; static readonly Logger Logger = LogManager.GetCurrentClassLogger();//声明NLog变量 public OptionsMiddleware(RequestDelegate next, IOptionsSnapshot<OptionsSetting> setttings) { this.next = next; this._options = setttings; } public async Task Invoke(HttpContext context) { BaseImg.SetOptions(_options.Value); await next(context); } }
如果此处替换为IOptions或者IOptionsMonitor可以解决
原因是
IOptionsSnapshot 是一个作用域服务(scoped service),它在每个 HTTP 请求处理范围内都会创建一个新的实例。
IOptions<T> 是一个单例服务,它在应用程序生命周期内只实例化一次。
IOptionsMonitor也是单例模式
参考资料:
.NET Core: Cannot resolve scoped service 'Microsoft.Extensions.Options.IOptionsSnapshot...' from root provider
https://siderite.dev/blog/net-core-cannot-resolve-scoped-service.html
https://www.cnblogs.com/liuzeqi/p/14132325.html
https://stackoverflow.com/questions/65457511/net-5-ioptionssnapshot-cannot-resolve-scoped-service
IOptionsMonitor