随笔 - 54  文章 - 1  评论 - 407  阅读 - 15万

.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   火星大能猫  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2012-07-10 某品牌led报文信息分析
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示