System.PlatformNotSupportedException 仅在作为 docker 映像运行时引用 System.Data.SqlClient

Posted

技术标签:

【中文标题】System.PlatformNotSupportedException 仅在作为 docker 映像运行时引用 System.Data.SqlClient【英文标题】:System.PlatformNotSupportedException when referencing System.Data.SqlClient ONLY when running as a docker image 【发布时间】:2021-11-15 06:00:35 【问题描述】:

我正在尝试将我的 azure 函数应用程序作为 docker 映像运行,当我尝试调用我的数据层时,它会抛出一个 System.PlatformNotSupportedException in Microsoft.Data.SqlClient.dll: 'Strings.PlatformNotSupported_DataSqlClient' 异常(无论我使用的是 EF Core 还是 Dapper) .将我的 API 项目设置为启动而不是 docker 映像时,我可以很好地运行应用程序。

那里有非常相似的问题,但没有一个考虑到只有当我尝试将其作为 docker 映像运行或我的目标框架是 netcoreapp3.1 时才会发生这种情况。我已经尝试过类似问题所说的内容。即添加 System.Data.SqlClient 作为 Nuget 包,无论我制作什么版本都无济于事。

我怀疑我需要在Dockerfile 中添加一些内容。

这里有一些附加信息:

编辑: 我可以通过简单地创建一个 azure 函数、添加 docker 支持、创建一个在本地数据库上执行 CRUD 操作的简单数据层、然后运行 ​​docker 映像并调用执行 CRUD 的端点来在新项目中重新创建问题手术。希望对您有所帮助。

【问题讨论】:

【参考方案1】:

Microsoft.Data.SqlClient NuGet 包包括许多支持不同 .NET 目标和不同运行时平台的 DLL。如果你得到一个

PlatformNotSupported 异常

这最终意味着您的应用程序没有加载适当的 DLL。

适用于 .NET Framework、.NET Core、.NET Standard、Windows、Linux 等的不同 DLL。NuGet 基础架构将根据您的应用程序需要自动引用和加载适当的 DLL。

如果您的应用程序直接从 NuGet 包加载 DLL,它会绕过所有这些逻辑并可能加载 不正确的 DLL.

lib/netstandard2.0/Microsoft.Data.SqlClient.dll 下 NuGet 包中的 DLL 基本上是任何不受支持的目标的后备 DLL,并且对于任何调用都会简单地抛出 PlatformNotSupported 异常。这是一个比在没有为其构建 DLL 的平台上运行时获得的更好的异常。最终,您希望使用 NuGet 包参考基础架构,或者在确定要加载哪个 DLL 时,您必须自己实现所有这些目标框架和平台支持逻辑。

此外,NuGet 包包含SqlClient 库的所有依赖信息,便于下载和引用依赖。如果您手动引用和加载单个 DLL,则由您来确保所有依赖项也可用于 SqlClient 库。

参考why do i get a platformnotsupported exception when my application hits a sqlclient method

您可以使用最新版本更新所有依赖项。它可能会解决您的问题。请检查实现的目标框架和平台是否支持您的代码逻辑。

参考这里Link 1 & Link 2

【讨论】:

但是当我让我的 API 项目启动时它可以工作。仅当我将其作为 docker 映像运行时才存在问题。我可能是错的,但这暗示我它给了我一个奇怪的错误,但真正的问题在于 docker 的某个地方? 我在使用发布功能时遇到了同样的问题。不知何故,构建和发布逻辑不知道如何输出正确的 dll。我的解决方案是使用始终复制设置为正确的文件添加硬依赖。感觉像是在作弊,而且与平台无关,但它确实有效。 将最新版本的Microsoft.Data.SqlClient 添加为 NuGet 依赖项(当前版本),并使用 最新 版本更新所有依赖项。我希望它不在码头问题上。如果问题仍然存在,请尝试redeploy【参考方案2】:

使用配置特定的覆盖文件,您可以指定 不同的配置设置(例如环境变量或 入口点)用于调试和发布构建配置。

要让 Docker Compose 显示在 Visual Studio 中运行的选项, docker 项目必须是启动项目。

如果您想要基于构建配置的不同行为(例如,Debug or Release),请添加特定于配置的 docker-compose 文件。文件应根据构建配置命名(例如 docker-compose.vs.debug.ymldocker-compose.vs.release.yml),并放置在与 docker-compose-override.yml 文件相同的位置

Visual Studio Tools

【讨论】:

以上是关于System.PlatformNotSupportedException 仅在作为 docker 映像运行时引用 System.Data.SqlClient的主要内容,如果未能解决你的问题,请参考以下文章