运行时 Azure 应用服务中缺少 System.Private.ServiceModel
Posted
技术标签:
【中文标题】运行时 Azure 应用服务中缺少 System.Private.ServiceModel【英文标题】:System.Private.ServiceModel missing in azure app service at runtime 【发布时间】:2018-11-17 16:27:07 【问题描述】:我正在尝试将 asp.net core 2.1 webapp 部署到 azure app 服务。 webapp 使用 wcf 服务,因此包含对 wcf 的引用。一切在编译和开发人员机器上运行良好。但是,当它部署到 azure app 服务时,webapp 无法启动。它抛出一个错误
Could not load file or assembly 'System.Private.ServiceModel, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
我已尝试发布独立且依赖于框架的应用程序。是否有一些特殊的方式需要包含或引用这个包?
【问题讨论】:
【参考方案1】:尝试在 ASP.NET Core 2.1 应用程序中使用 SoapCore NuGet 包后,我遇到了类似的解决方案。在 Windows 10 上本地运行良好,但在我发布到 Azure 后给出了与原始海报完全相同的堆栈跟踪。以下 GitHub 问题帮助我理解了问题:
https://github.com/dotnet/wcf/issues/2349
对我来说,SoapCore 引用了System.ServiceModel.Http 4.4.0
,它依赖于System.Private.ServiceModel 4.4.0
。如果你下载 NuGet 包并打开 System.Private.ServiceModel 4.4.0
的 nupkg 文件并观察“runtimes”子文件夹,你会看到它只列出了“win7”和“unix”。 Azure 似乎正在寻找运行时“win-x86”或“win-x64”,上面的 GitHub 问题解释了这些 RID 是如何不包含在“win7”RID 中的。看到问题已关闭,我下载了System.Private.ServiceModel 4.5.0
以检查“runtimes”子文件夹,发现它已从“win7”更改为“win”,就像在 GitHub 问题中提到的那样。
为了解决我的问题,我直接将System.ServiceModel.Http 4.5.0
的依赖项添加到我的项目中。这包括 System.Private.ServiceModel 4.5.0
的较新依赖项,Azure 会正确识别“win”运行时,以确保在发布时我的应用程序中包含必要的 DLL。
【讨论】:
在我的例子中,有一堆不经意间添加的依赖项。我能够简单地删除对 System.ServiceModel 的引用来解决问题。【参考方案2】:Core 2.0 API 也有同样的问题。 我打开了cs项目文件并进行了下一个更改
<PackageReference Include="System.ServiceModel.Http" Version="4.4.*" />
到
<PackageReference Include="System.ServiceModel.Http" Version="4.5.*" />
将版本从 4.4 更改为 4.5,项目将重新加载正确的程序集。
【讨论】:
以上是关于运行时 Azure 应用服务中缺少 System.Private.ServiceModel的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure Web 应用/Azure API 上部署时缺少 CORS 标头
将节点应用程序部署到 Azure 应用程序服务时 .bin 文件夹中缺少文件
为什么在Azure Function v2中运行的ClaimsPrincipal中缺少'identityProvider'声明?