配置AutoQueryFeature时抛出System.MissingFieldException的原因
异常触发原因
你遇到的运行时异常:
System.MissingFieldException HResult=0x80131511 Message=Field not found: 'ServiceStack.Configuration.RoleNames.Admin'. Source=ServiceStack.Server StackTrace: at ServiceStack.AutoQueryFeature..ctor() at Sample6.ConfigureAutoQuery.<>c.<Configure>b__0_0(ServiceStackHost appHost) in E:\Downloads\Sample6\Sample6\Configure.AutoQuery.cs:line 11 at ServiceStack.ServiceStackHost.RunManagedAction(Action`1 fn)
属于典型的ServiceStack系列NuGet包版本不匹配问题,是官方入门项目模板生成时偶发的依赖还原错误,和代码编写、功能勾选操作没有关系。
具体原因是:包含AutoQueryFeature实现的ServiceStack.Server包,和核心ServiceStack基础包在NuGet还原时拉取到了不一致的版本。高版本的AutoQueryFeature构造逻辑中引用了RoleNames.Admin字段,但运行时加载的低版本核心ServiceStack程序集中不存在该字段,就会抛出字段缺失的运行时异常。
修复步骤
按以下操作即可解决问题:
- 在Visual Studio右侧解决方案资源管理器中,右键解决方案节点,选择「管理解决方案的NuGet程序包」
- 在弹出的NuGet管理页切换到「已安装」标签,找到所有包名以
ServiceStack开头的依赖 - 将所有ServiceStack相关包统一更新到同一个最新稳定版本,禁止不同ServiceStack包使用不同版本号
- 关闭Visual Studio,手动删除项目根目录下的
bin、obj两个缓存文件夹 - 重新打开项目,依次点击菜单栏「生成」→「清理解决方案」,完成后再点击「重新生成解决方案」
- 重新运行项目即可正常启动,不会再触发该异常
ServiceStack官方所有组件包都是严格同版本号同步发布的,后续如果遇到任何ServiceStack相关的运行时类型找不到、字段不存在、方法签名不匹配的异常,优先检查所有ServiceStack包版本是否完全一致,绝大多数这类问题都可以通过统一版本快速修复。
相关参考截图
- 集成AutoQuery的ServiceStack示例项目

- AutoQuery Feature异常报错截图

内容的提问来源于stack exchange,提问作者pvieira
相关产品推荐
相关产品推荐

