突然 - 工作项目中'The certificate chain was issued by an authority that is not trusted in Microsoft.Data.S



我有一个ASP。在Windows服务器上的IIS中运行的Net Webforms网站。此服务器上还有SQL服务器。

该网站的一切都很好,但现在我看到了使用DataAdapter填充表格的问题。

所以这里有一些代码,请注意,这只是代码的基本轮廓,因为实际代码包含机密信息。

public List<Summary> Fetch(string Connection, int parameter1, int parameter2, bool parameter3)
{
List<Summary> collection = new List<Summary>();
using (SqlConnection dbConnection = new SqlConnection(Connection))
{
using (SqlCommand dbCommand = dbConnection.CreateCommand()) // Result is complex
{
dbCommand.CommandType = CommandType.StoredProcedure;

//
// Code to add parameters and set commandText goes here
//
using (SqlDataAdapter da = new SqlDataAdapter(dbCommand))
{
DataTable table = new DataTable();
DataRow row;
try
{
da.Fill(table);
}
catch(Exception ex)
{
// Log error
}

for (int i = 0; i < table.Rows.Count; i++)
{
row = table.Rows[i];
Summary data = Populate(row);
collection.Add(data);
}
}
}
}
return collection;
}

上面的内容在一个库中,在Web窗体网站中是这样调用的。

var Summaries = MyLibrary.Fetch(ConnectionString, 1, 111, false);

正如我所说,一切都很顺利。现在,突然之间,上面的内容停止了工作,Summaries总是空的。

为了调查,我尝试了以下方法。

使用xUnit创建了一个与网站使用的参数相同的测试。这些是在调试期间捕获的,以确保它们匹配。结果返回1项。

然后,我在SQL management Studio中运行了存储过程,它与xUnit测试匹配,返回了1个项目。

然后我检查了SQL事件探查器,这就是事情看起来有点奇怪的地方。当web窗体调用库时,跟踪中没有记录任何内容。

因此,网站和xUnit测试都使用相同的库,传递相同的参数,但其中一个有效,另一个无效。。。非常奇怪。

作为最后的手段,我将库项目添加到Web Forms项目中,并通过它进行调试。。。然后我发现了错误。

da.Fill(table);

上面的行生成了以下异常。

引发异常:'Microsoft。数据SqlClient。"SqlException"。数据SqlClient.dll已成功与服务器建立连接,但在登录过程中出现错误。(提供程序:SSL提供程序,错误:0-证书链是由不受信任的颁发机构颁发的。)

看了看这里的堆栈,我看到了许多关于我需要安装证书的回复。

我的问题是,如果是这样的话,为什么,为什么现在?代码从工作到现在没有任何变化。网站和SQL服务器位于同一个windows服务器上。还有,为什么xunit测试在没有它的情况下可以工作,而当我在同一台机器上调试时,网站却不能!

我现在唯一更改的项目是的安装。Net6和星期二的补丁导致了一些更新和服务器的重新启动。

Microsoft。数据SqlClient 4.0默认情况下使用ENCRYPT=True。要么你在服务器上放一个证书(不是自签名的),要么你放

TrustServerCertificate=是;

在连接字符串上。

我也遇到了这个问题。Net 6.0

当我升级Microsoft时,它突然开始出现。EntityFrameworkCore。SqlServer

FROM版本=";6.0.0〃;到版本=";6.0.1〃;

我在连接字符串中添加了EncryptTrustServerCertificate

数据源=(本地);初始目录=XXXXXXX;Trusted_Connection=True;MultipleActiveResultSets=True加密=真TrustServerCertificate=真

我在ConnectionStrings中添加了TrustServerCertificate=True来解决此问题。这就是的样子

"ConnectionStrings": {
"DefaultConnection": "Server=localhost; Database=GreenProducts;Trusted_Connection=True; TrustServerCertificate=True"
}

希望这能有所帮助。

我在第一次升级Microsoft时突然遇到了同样的问题。数据SqlClient到4.x.x。我恢复到2.0.1版本,也出现了同样的问题。

然后我删除了所有";bin";以及";obj";每个项目的文件夹。然后执行一个";dotnet恢复";。在那之后,一切如常。

与其他类似,我们在升级Microsoft后也出现了此错误。EntityFrameworkCore。SQL Server从2.2.6到6.0.5以及Microsoft。数据SqlClient从3.0.0到4.1.0。

然而,在我们的案例中删除了微软。数据SqlClient修复了此问题。

我注意到微软。EntityFrameworkCore。SqlServer列出了Microsoft的一个依赖项。数据解决方案资源管理器中的SqlClient 2.1.4,也许这就是删除另一个有效的原因。

让我的场景有点不同的是,我有一个多层应用程序,因此,我的存储库层是我的解决方案中的一个独立项目(注意:我的项目使用.NET 6/7)。

我知道问题肯定在我这边,但以下命令没有按我想要的方式工作:

PM> Scaffold-DbContext name="MyConnectionString" Microsoft.EntityFrameworkCore.SqlServer -OutputDir MyModels

所以我最终做了以下事情:

  1. 确保在启动项目的appsettings.json文件中正确配置了连接字符串。如上面的答案所述,将以下内容添加到连接字符串Encrypt=True;TrustServerCertificate=True中。我的连接字符串最终是这样的:Server=SQLEXPRESS;Database=MyExampleDB;Trusted_Connection=True;user id=TheUser;password=MySuperStrongPassword;Encrypt=True;TrustServerCertificate=True(显然集成的安全性也可以)
  2. 打开VS 2022的开发人员命令提示符
  3. cd到回购项目(或需要上下文和模型驻留的项目)
  4. 运行以下命令:dotnet ef dbcontext scaffold name="MyConnectionString" Microsoft.EntityFrameworkCore.SqlServer -o MyModels -f --startup-project ..MyProject.API
  5. 完成-生成的模型和DBContext应该在您的repo项目中

注意:

请记住安装dotnet ef。如果没有,请在开发人员命令提示符dotnet tool install --global dotnet-ef中运行此命令。如果需要更新,请运行dotnet tool update --global dotnet-ef。有关以上内容的更多信息:查看实体框架核心工具参考-.NET Core CLI

如果脚手架是成功的,但你会遇到这样的信息:The database user has not been granted 'VIEW DEFINITION' rights. Scaffolding requires these rights to construct the Entity Framework model correctly. Without these rights, parts of the scaffolded model may be missing, resulting in incorrect interactions between Entity Framework and the database at runtime.-看看David Browne在这里的回答:实体框架核心7.0.2";数据库用户尚未被授予"查看定义"权限";

希望这能帮助到别人。

我在应用迁移时在EF Core 7上遇到错误。我已经更改了连接字符串名称并解决了问题。

相关内容

最新更新