.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
posted on 2024-07-10 11:33  火星大能猫  阅读(64)  评论(0编辑  收藏  举报