AzureAdTokenCredentials依赖ActiveDirectory 3.13.1.846引发文件未找到异常
老兄,我完全懂这种“明明装了新版本却报老版本找不到”的崩溃感——之前在做Media Services和Azure Functions的整合时,我也踩过一模一样的坑!咱们一步步来解决:
问题根源
你遇到的FileNotFoundException本质是依赖版本冲突:Microsoft.WindowsAzure.MediaServices.Client(也就是创建CloudMediaContext需要的包)内部可能硬依赖了旧版本的ADAL库(3.13.1.846),而你手动安装的3.19.4版本和它的依赖要求不匹配,导致程序集绑定失败。
具体解决办法
1. 先检查NuGet依赖关系
打开你的项目的NuGet包管理器,找到Microsoft.WindowsAzure.MediaServices.Client,查看它的依赖项列表,确认它要求的ADAL版本范围。
- 如果它明确要求≤3.13.x,那最简单的办法就是把你安装的
Microsoft.IdentityModel.Clients.ActiveDirectory降级到符合要求的版本(比如3.13.1),这样就能直接匹配依赖,避免冲突。
2. 添加程序集绑定重定向(强制用新版本)
如果不想降级ADAL,那就用绑定重定向告诉程序“不管找哪个旧版本,都用我装的3.19.4”。Azure Functions的配置有点特殊,步骤如下:
- 编辑你的项目文件(
.csproj),添加以下配置:<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> - 在项目根目录创建
redirects.json文件,内容如下:{ "assemblyRedirects": [ { "name": "Microsoft.IdentityModel.Clients.ActiveDirectory", "publicKeyToken": "31bf3856ad364e35", "oldVersion": "0.0.0.0-3.19.4.0", "newVersion": "3.19.4.0" } ] } - 回到
.csproj,添加对这个文件的引用,确保部署时能带上:<ItemGroup> <None Update="redirects.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
3. 清理重建,确保依赖干净
- 右键项目 → 清理解决方案
- 手动删除项目根目录下的
bin和obj文件夹 - 运行
dotnet restore恢复NuGet包,再重新构建项目 - 本地运行Azure Functions时,确保调试环境加载的是正确版本的dll
4. 云端部署后的检查
如果是部署到Azure云端的Functions,登录Kudu控制台(https://<你的函数名>.scm.azurewebsites.net),进入site/wwwroot/bin文件夹,查看Microsoft.IdentityModel.Clients.ActiveDirectory.dll的版本是否是3.19.4。如果不是,重新部署时勾选“包含所有依赖项”,或者手动上传正确的dll。
额外建议:考虑迁移到MSAL
ADAL(Microsoft.IdentityModel.Clients.ActiveDirectory)已经被微软弃用了,Media Services的新版本也推荐使用MSAL(Microsoft.Identity.Client)来获取令牌。如果有时间,建议重构代码:用ClientSecretCredential或者InteractiveBrowserCredential获取令牌,再传入CloudMediaContext,这样能彻底避免旧版本ADAL的依赖问题。
内容的提问来源于stack exchange,提问作者ThatCreole

