XeroClient调用RefreshAccessTokenAsync报Method not found如何解决
运行时方法找不到异常(Xero令牌刷新场景)排查方案
问题复现场景
执行以下令牌刷新代码时触发运行时异常:
XeroToken = Await c.RefreshAccessTokenAsync(XeroToken).ConfigureAwait(False)
异常详情:
Method not found: 'System.Threading.Tasks.Task`1<IdentityModel.Client.TokenResponse> IdentityModel.Client.HttpClientTokenRequestExtensions.RequestRefreshTokenAsync(System.Net.Http.HttpMessageInvoker, IdentityModel.Client.RefreshTokenRequest, System.Threading.CancellationToken)'
对应业务逻辑:
Dim c = New XeroClient(XeroConfig) ... Dim utcTimeNow = DateTime.UtcNow If utcTimeNow > Me.XeroToken.ExpiresAtUtc Then XeroToken = Await c.RefreshAccessTokenAsync(XeroToken).ConfigureAwait(False) Dim json = New JavaScriptSerializer().Serialize(XeroToken) Dim token As String = Me.SaveToken(json) End If
已完成的前置排查:
- 已确认项目不存在同一NuGet包的多版本显式引用
- 已清理解决方案、删除bin/obj目录后重新生成,项目可正常构建部署,异常仍复现
- 近期团队更新Visual Studio版本后曾出现大面积包引用、编译错误,目前显性编译错误已全部修复,表面功能可正常运行
根因说明
这是典型的程序集版本不匹配导致的MissingMethodException:你引用的Xero OAuth2客户端包是基于特定版本的IdentityModel编译的,编译时依赖的3参数RequestRefreshTokenAsync扩展方法签名存在,但运行时实际加载到的IdentityModel.dll是不兼容的其他版本(跨大版本升级时IdentityModel曾修改过这个方法的签名,移除/调整了对应重载),因此运行时找不到匹配方法。
VS更新后NuGet缓存损坏、间接依赖版本未统一、绑定重定向配置残留,都可能导致“编译正常但运行时加载错版本dll”的问题,NuGet包管理器的“无版本冲突”提示在这类场景下经常漏判,不能作为判断依据。
修复步骤
按顺序操作即可解决:
- 确认依赖版本匹配要求
查看当前项目安装的Xero.NetStandard.OAuth2包的依赖说明,找到它要求匹配的IdentityModel主版本号,必须使用该主版本范围内的IdentityModel,禁止跨大版本升级,这是这类异常最高发的诱因。 - 全解决方案统一IdentityModel版本
遍历解决方案下所有项目,不管是直接引用还是间接依赖IdentityModel,全部统一安装和Xero包要求完全一致的IdentityModel版本,关闭NuGet版本浮动配置。 - 修正程序集绑定重定向配置
右键启动项目选择「添加程序集绑定重定向」,打开启动项目的web.config/app.config,检查<runtime><assemblyBinding>节点下的IdentityModel配置:- 确认重定向规则覆盖所有旧版本,重定向的目标版本和你实际安装的版本完全一致,删除残留的旧版本重定向规则
- 可添加codeBase配置强制运行时从bin目录加载指定版本dll,避免加载GAC或其他共享目录下的不兼容版本,配置示例如下:
注意将示例中的版本号替换为你实际安装的正确版本号<dependentAssembly> <assemblyIdentity name="IdentityModel" publicKeyToken="e78773a1390e2292" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> <codeBase version="6.0.0.0" href="bin/IdentityModel.dll" /> </dependentAssembly> - 校验输出目录实际dll版本
重新生成项目后,进入启动项目的bin输出目录,找到IdentityModel.dll,右键查看「属性-详细信息」,确认文件版本和你NuGet安装的版本完全一致。如果版本不对,手动删除该dll后重新执行NuGet还原、项目生成。 - 清理运行环境缓存
如果是IIS部署场景,删除站点对应bin目录、系统盘下Temporary ASP.NET Files目录中对应站点的缓存文件后重新部署,避免旧版本dll被IIS缓存加载。
内容的提问来源于stack exchange,提问作者Ivan Gechev
相关产品推荐
相关产品推荐

