运行时 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'声明?

Azure 应用服务中缺少“容器设置”部分

使用 Azure Front Door 时缺少 UserId 属性的应用程序见解

Azure 门户中缺少活动订阅