[英]A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (unable to change SQL Server)
我有一個作為共享帳戶托管的 ASP.Net 站點。 我收到錯誤消息:
A connection was successfully established with the server, but then an error
occurred during the pre-login handshake. (provider: SSL Provider, error: 0 -
The specified data could not be decrypted.
我在網上找到的信息似乎表明問題是 SQL Server 不信任證書(SSL 證書是由威瑞信和托管服務簽署的有效證書,而不是自簽名的)。 但是,托管服務告訴我:
SQL Server 必須設置為“強制協議加密”,因為它是共享服務器
他們無法導入證書或進行任何更改,也不允許我為此做任何事情
還有其他解決方案嗎? 這是我的代碼有問題嗎? 我嘗試從 bin 文件夾和 web.config 中刪除我的 DLL,並創建一個直接連接到數據庫的 aspx 頁面,但我仍然遇到同樣的錯誤!
有可能解決這個問題嗎? 是我的代碼以某種方式導致了這種情況嗎?
編輯:我改為在連接字符串中使用 ip 地址,它暫時重新開始工作,但現在它再次給我錯誤。 我不確定為什么它偶爾會再次開始工作,然后突然停止工作。 有人知道嗎?
(代碼在我本地托管的開發服務器上完美運行)
網頁
<%@ Page language="c#" %>
<%@ Import namespace="System" %>
<%@ Import namespace="System.Web" %>
<%@ Import namespace="System.Data" %>
<%@ Import namespace="System.Data.SqlClient" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
try
{
//Now insert into database
SqlConnection conn = new SqlConnection( ConfigurationManager.AppSettings["ConnectionString"] );
conn.Open();
SqlCommand cmd = new SqlCommand( );
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM TestTable";
cmd.ExecuteReader();
Response.Write( "done" );
}
catch (Exception sqlEx)
{
Response.Write( sqlEx.ToString() );
}
}
</script>
網頁配置
<?xml version="1.0"?>
<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
<appSettings>
<add key="ConnectionString" value="server=mydb.thehostingservice.com;user=dbUser;initial catalog=test;pwd=dbpass" ></add>
</appSettings>
</configuration>
我不知道這是否是一個好的永久修復,但我最終能夠通過使用數據庫的 IP 地址和連接字符串中的端口而不是數據庫的“web”地址來連接它。 所以我用“192.168.1.213,1433”替換了“mydb.thehostingservice.com”。
在此之后,它能夠連接。
但是讓我懷疑這是一個永久的解決方案是,在此之后我切換回在連接字符串中使用“mydb.thehostingservice.com”來查看 ti 是否會中斷,現在也可以了! 所以這可能會在未來再次對我造成影響。
以前我收到了錯誤,但我刪除了我的 web.config 和 dll 並暫時修復了它 - 但最近一次刪除這些東西並沒有修復它 - 所以我擔心這是一樣的。
編輯:它再次給了我錯誤。 那不是解決方案。 我不確定為什么它偶爾會再次開始工作,然后突然停止工作。 有人知道嗎?
我在互聯網上閱讀此問題的先前帖子和解決方案是,問題可能出在您的客戶端而不是他們的服務器上。 嘗試解決此問題的第一步是將以下內容添加到您的連接字符串中:
;Use Encryption for Data=True
然后查看是否可以解決問題,或者是否會更改錯誤消息。
好的,我注意到的一件事是您的連接字符串中有..;user=..
。 嘗試將“user=”更改為“user id=”。
在這一點上我只能想到另一件事:在您的客戶端上調出 SQL 配置實用程序,然后右鍵單擊 SQL Native Client 協議並選擇“屬性”。 然后注意“Force [Protocol] Encryption”設置的內容,然后將其反轉。 現在重新啟動一切並嘗試再次連接。
我最近在升級到 .NET Core 6 后發生了這種情況。在 .Net Core 2.1 中一切都很好。 我復制了正在生成的 SQL 並在 SSMS 中手動運行它。 Entity Framework 生成的簡單查詢返回的結果絕對是巨大的。 40,000 多條記錄,每條記錄有數百個字段。 查詢超時並返回部分結果。 我假設損壞的數據無法解密。 我追蹤到使用 IQueryable()。 切換以下代碼
private IQueryable<Event> EventQueryable(Guid id) =>
EventQueryable()
.Where(evt => evt.Id == id);
Event evt = await _dbContext.EventQueryable(id)
避免 IQueryable
Event evt = await _dbContext.Events.Where(e => e.Id == id)
幾乎立即返回一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.