如何调试.NET Standard 2.0 Azure Function中的FileLoadException异常
没法用RDP和Fuslog确实有点头疼,但咱们从日志里的线索——找不到Microsoft.WindowsAzure.Storage, Version=9.1.1.0——可以一步步排查:
第一步:核对项目依赖版本与引用
先打开你的Function项目的.csproj文件,检查<PackageReference>里的Microsoft.WindowsAzure.Storage版本是不是9.1.1.0。如果版本不对,直接调整到对应版本然后重新还原包。
另外,用命令dotnet list package --include-transitive查看所有间接依赖,看看有没有其他NuGet包引用了这个组件的不同版本,版本不一致很容易导致加载冲突。第二步:检查部署包的内容完整性
本地生成发布包后解压,看看bin目录里有没有Microsoft.WindowsAzure.Storage.dll,并且右键查看文件属性里的版本是否是9.1.1.0。如果缺失,那大概率是打包配置的问题,记得在.csproj里加上:<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>这个配置能确保所有依赖都被复制到输出目录,避免部署时遗漏。
第三步:利用Azure Portal的诊断工具
登录Azure Portal,找到你的Function App,进入「诊断并解决问题」页面,搜索“Function App无法启动”或“依赖项缺失”相关的排查项,运行诊断后通常能获取更详细的错误细节——比如是真的找不到文件,还是版本不匹配导致的加载失败。第四步:处理绑定重定向(如果是版本冲突)
如果是Azure Functions Runtime自带的Microsoft.WindowsAzure.Storage版本和你的项目版本不一致,就需要添加绑定重定向。在项目根目录创建app.config文件,添加以下内容:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-9.1.1.0" newVersion="9.1.1.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>同时在
.csproj里加上:<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>这样发布时绑定重定向会被正确应用。
第五步:用Kudu控制台直接检查服务器文件
在Azure Portal的Function App里,进入「开发工具」>「高级工具」打开Kudu控制台,然后导航到site/wwwroot/bin目录:- 用
dir Microsoft.WindowsAzure.Storage.dll确认文件是否存在 - 如果存在,用
dumpbin /headers Microsoft.WindowsAzure.Storage.dll查看文件的版本信息(如果Kudu里没有dumpbin,也可以通过文件属性查看)
- 用
可选:考虑迁移到新的存储SDK
Microsoft.WindowsAzure.Storage是旧版SDK,现在官方推荐使用Azure.Storage.Blobs等新的Azure Storage包。如果你的项目允许,迁移到新包不仅能避免版本冲突问题,还能获得更好的支持和新功能。
内容的提问来源于stack exchange,提问作者Kzryzstof

