【发布时间】:2025-12-28 15:35:06
【问题描述】:
我有一个在 Windows 服务器上的 IIS 中运行的 ASP.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 Profiler,这就是事情看起来有点奇怪的地方。当网络表单调用库时,跟踪中没有记录任何内容。
因此,网站和 xUnit 测试都使用同一个库,传递相同的参数,但一个有效,另一个没有……很奇怪。
作为最后的手段,我将库项目添加到 Web 窗体项目并继续调试...然后我发现了错误。
da.Fill(table);
以上行产生了以下异常。
抛出异常:Microsoft.Data.SqlClient.dll 中的“Microsoft.Data.SqlClient.SqlException” 与服务器成功建立连接,但在登录过程中出现错误。 (提供者:SSL 提供者,错误:0 - 证书链由不受信任的机构颁发。)
在堆栈上环顾四周,我看到很多回复说我需要安装证书。
我的问题是,如果是这样,那么为什么以及为什么现在? 从工作到现在,代码没有任何变化。网站和 SQL 服务器在同一个 windows 服务器上。另外,为什么没有它xunit测试可以工作,而我在同一台机器上调试时网站不能!
我现在唯一更改的项目是安装 .Net 6 和补丁星期二导致一些更新和服务器重新启动。
【问题讨论】:
-
为什么是现在?所有证书都有到期日,这可能刚刚发生。我建议查看证书链 (top-password.com/blog/…) 并仔细检查是否没有过期。如果您使用像 StartSSL 这样的 CA,则根 CA 不再受信任(他们做了一些坏事并受到 Microsoft/Google/每个人的正确惩罚)
-
那么为什么 web-forms 项目关心这个证书,而 xunit 测试项目却不关心,使用相同的连接字符串在同一台机器上运行?
-
SQL Server 安装了自签名的 X.509 证书,因此如果您在连接字符串中使用
encrypt=true或类似名称,您通常会从一开始就看到这样的错误 - 除非您也有trustServerCertificate=true。这只是现在才发生表明以下一项或多项:1)连接字符串已更改; 2) SQL Server 实例有一个 CA 提供的证书,其 ICA/根证书已过期(例如:Let's Encrypt); 3) SQL Server 实例有一个 CA 提供的证书,由于 Microsoft 受信任的根证书更新,该证书的 CA 不再受信任。 -
encrypt=true和trustServerCertificate=true从未出现在连接字符串中。此外,如果 Web 表单站点和 SQL 服务器在同一台机器上,那么证书是否已经存在?仍然没有解释为什么使用相同连接字符串调用相同库的 2 个独立项目会产生不同的结果。换句话说,为什么我的 xunit 测试不需要证书? -
我在将
Microsoft.Data.SqlClient从3.0.1升级到4.0.0后开始看到这个问题
标签: c# sql-server