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.yml
和 docker-compose.vs.release.yml
),并放置在与 docker-compose-override.yml 文件相同的位置
Visual Studio Tools
【讨论】:
以上是关于System.PlatformNotSupportedException 仅在作为 docker 映像运行时引用 System.Data.SqlClient的主要内容,如果未能解决你的问题,请参考以下文章