升级Newtonsoft.Json后Azure Search .NET SDK出现序列化异常
你遇到的这两个异常,本质都是旧版Azure Search .NET SDK和高版本Newtonsoft.Json的兼容性不匹配导致的。早期的Microsoft.Azure.Search包对Newtonsoft.Json的版本依赖很严格,当你把Json.NET升到9.0.1以上时,SDK内部依赖的SerializationBinder相关逻辑在新版本里有API变更,触发了InvalidOperationException;而升到10.0.3时,SDK直接找不到预期的方法签名,就抛出了MissingMethodException。
下面给你几个可行的解决思路,按推荐程度排序:
1. 迁移到最新版Azure Search SDK(首推)
旧的Microsoft.Azure.Search已经停止维护了,微软现在主推的是Azure.Search.Documents包,它不仅修复了旧版本的兼容性问题,还支持System.Text.Json,功能也更完善。操作步骤很简单:
- 先卸载项目里的旧
Microsoft.Azure.SearchNuGet包 - 安装最新版的
Azure.Search.Documents包(可以用NuGet包管理器搜索,或者命令行执行Install-Package Azure.Search.Documents) - 最后调整代码里的命名空间:把原来的
Microsoft.Azure.Search替换成Azure.Search.Documents,对应的API比如DocumentsOperations现在改成了SearchClient相关的方法,适配起来也不难。
2. 用程序集绑定重定向救急(适合暂时不能升级SDK的场景)
如果因为项目限制没法换SDK,那可以通过绑定重定向让应用把所有对Newtonsoft.Json的请求统一指向你安装的版本。在项目的app.config(桌面应用)或者web.config(Web应用)里添加这段配置:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <!-- 把oldVersion范围改成你覆盖的版本,newVersion改成你实际安装的版本号 --> <bindingRedirect oldVersion="0.0.0.0-10.0.3" newVersion="10.0.3" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
这个配置会强制让应用把所有旧版本Json.NET的调用重定向到你指定的新版本,能解决方法找不到的问题。
3. 降级Newtonsoft.Json到兼容版本
如果上面两种方法都走不通,那就只能把Newtonsoft.Json降级到旧SDK能兼容的版本了。你可以去旧版Microsoft.Azure.Search的NuGet页面看它的依赖说明,一般旧版SDK兼容的范围是9.0.1 ≤ Newtonsoft.Json < 10.0.0,所以降级到9.0.1或者9.x的其他版本,就能避免这两个异常。
内容的提问来源于stack exchange,提问作者komluk

