簡體   English   中英

與服務器成功建立連接,但在登錄前握手期間發生錯誤。 (無法更改 SQL Server)

[英]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 證書是由威瑞信和托管服務簽署的有效證書,而不是自簽名的)。 但是,托管服務告訴我:

  1. SQL Server 必須設置為“強制協議加密”,因為它是共享服務器

  2. 他們無法導入證書或進行任何更改,也不允許我為此做任何事情

還有其他解決方案嗎? 這是我的代碼有問題嗎? 我嘗試從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM