Npgsql - 公共语言运行时检测到无效程序

问题描述 投票:0回答:1

我有一个使用 .NET 8 开发的简单 API,它使用 Npgsql 版本 4.0.0 连接到 postgreSQL DB。

API 打开连接、查询数据库版本、关闭连接。

API 已上传到 2 台服务器,运行 Windows Server 2019 并通过 IIS 公开 API。

两台服务器都有:

  • 相同版本的 IIS
  • 相同的 IIS 配置
  • 相同的部署路径
  • 加载相同的 API 版本
  • 相同的 .NET Core 托管捆绑包

API 构建具有:

  • 相同的 web.config
  • 同一条路
  • 同一个图书馆
  • 相同的构建

但是,虽然在一台服务器上一切正常,但另一台服务器在 connection.open() 期间生成此错误;

 Values Problem to open the connection
  System.InvalidProgramException: Common Language Runtime detected an invalid program.
     at Npgsql.NpgsqlDataReader.Read(Boolean async)
     at Npgsql.NpgsqlDataReader.Read()
     at Npgsql.PostgresDatabaseInfo.LoadBackendTypes(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async)
     at Npgsql.PostgresDatabaseInfo.LoadPostgresInfo(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async)
     at Npgsql.PostgresDatabaseInfoFactory.Load(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async)
     at Npgsql.NpgsqlDatabaseInfo.Load(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async)
     at Npgsql.NpgsqlConnector.LoadDatabaseInfo(NpgsqlTimeout timeout, Boolean async)
     at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
     at Npgsql.ConnectorPool.AllocateLong(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
     at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext()
  --- End of stack trace from previous location ---
     at Npgsql.NpgsqlConnection.Open()
     at MyAPI.Values.Values(String httpRequestDomainName) in \Controllers\Values.cs:line 45

我尝试改变:

  • 依赖框架和独立构建,
  • 网络配置
  • 重置 IIS
  • 清理IIS临时文件
  • 重置池
  • 将 NPGSQL 库更新到版本 8.0.4

但没有成功。

奇怪的是,当使用 Kestrel 时,应用程序可以正常工作,只有当使用 IIS 时,应用程序就无法工作。

对于业务选择,不可能使用kestrel,我们必须使用IIS。

谢谢

asp.net-core .net-core iis npgsql kestrel
1个回答
0
投票

由于此 API 已经在您的一台 IIS 服务器中正常工作,因此我认为两个服务器环境或配置之间应该存在一些差异。

首先,您可以检查这两台服务器的操作系统和安全更新版本是否一致。

其次,比较两台服务器上安装的 .NET SDK 版本是否相同,因为发布步骤是由 .NET Core SDK 处理的。只需执行此命令行:

dotnet --list-sdks
.

第三,确保托管应用程序池配置为

No Managed Code
Integrated Mode

如果以上方法都不起作用,我想你就得寻找更多信息来查明问题所在,比如更详细的日志信息。

© www.soinside.com 2019 - 2024. All rights reserved.