2024年6月3日 星期一

[研究]ASP.NET, WebForm, 錯誤訊息:System.ComponentModel.Win32Exception: 等候操作已逾時。

[研究]ASP.NET, WebForm, 錯誤訊息:System.ComponentModel.Win32Exception: 等候操作已逾時。

2024-06-03

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

System.ComponentModel.Win32Exception: 等候操作已逾時。

System.Web.HttpUnhandledException (0x80004005): 已發生類型 'System.Web.HttpUnhandledException' 的例外狀況。 ---> System.Data.SqlClient.SqlException (0x80131904): 執行逾時到期。在作業完成之前超過逾時等待的時間,或是伺服器未回應。 ---> System.ComponentModel.Win32Exception (0x80004005): 等候操作已逾時。

   於 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

********************************************************************************

ChatGPT

這個錯誤通常表示在執行SQL查詢時發生超時,導致操作無法完成。這可能是由於資料庫查詢的複雜性或資料庫伺服器負載過重而導致的。

要解決這個問題,你可以考慮以下幾個方法:

  • 優化查詢:檢查你的SQL查詢是否可以進行優化,例如使用適當的索引、減少不必要的運算、分批處理數據等。
  • 增加查詢超時時間:在執行查詢之前,你可以設置SqlCommand對象的CommandTimeout屬性來增加查詢的超時時間。這樣可以給予查詢更多的時間來完成操作。

command.CommandTimeout = 120; // 這裡設置為120秒,你可以根據需求調整 

  • 檢查伺服器負載:如果是因為伺服器負載過重導致的超時,可以嘗試檢查伺服器的資源使用情況,並考慮增加資源或優化伺服器配置。
  • 使用非同步操作:考慮使用非同步操作來執行資料庫查詢,這樣可以提高應用程式的效能,並減少超時的可能性。
  • 查看日誌和監控:定期檢查應用程式的日誌和監控資料,以便及時發現並解決超時問題。

通常情況下,結合上述方法可以幫助你解決這個問題。如果問題仍然存在,可能需要更深入地分析程式碼和資料庫配置,以找到根本原因並進行解決。
********************************************************************************
command.CommandTimeout  最大值多少 ? 預設值多少 ? 

ChatGPT

在 .NET 中,SqlCommand 的 CommandTimeout 屬性表示執行 SQL 命令的最大等待時間(以秒為單位)。這個屬性的預設值是 30 秒。

CommandTimeout 的最大值是由系統的最大整數值來表示。在 .NET Framework 中,這個值是 Int32.MaxValue,它代表 2,147,483,647 秒,大約是 68 年。這個數值實際上是一個很大的時間範圍,對於絕大多數的應用程式來說已經足夠了。

如果你需要設置超過這個值的超時時間,那麼你可能需要重新評估你的應用程式設計,因為長時間的等待可能意味著系統設計存在問題,或者是資料庫操作過於耗時。

總的來說,在使用 CommandTimeout 屬性時,你應該根據你的應用程式需求和資料庫操作的實際情況來設置適當的值。

********************************************************************************
Copilot 

這個錯誤訊息表示您的 ASP.NET 應用程式在執行 SQL 查詢時超過了預設的等待時間。這可能是因為查詢需要的時間超過了 SqlCommand 物件的 CommandTimeout 屬性所設定的值,或者是 httpRuntime 的 executionTimeout 屬性的值。

參考

如何延長asp.net vb程式等候時間, Win32Exception – 等候操作已逾時

當您在 ASP.NET 應用程式中使用 DataAdapter 方法時,要求逾時錯誤

以下是一些可能的解決方法:

1.增加 SqlCommand 的 CommandTimeout 屬性的值:這個屬性決定了執行 SQL 命令前等待的最長時間(以秒為單位)。

2.修改 web.config Machine.config 檔案中的 executionTimeout 屬性的值:這個屬性會指出要求在 ASP.NET Web 應用程式關閉之前允許執行的最大秒數2。以下是如何在 web.config 檔案中設定 ExecutionTimeout 屬性值的步驟:

<configuration>
    <system.web>
        <httpRuntime executionTimeout="新的逾時值" 
maxRequestLength="4096" 
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4" appRequestQueueLimit="100"  />
    </system.web>
</configuration>

請將 “新的逾時值” 替換為您希望設定的新的逾時時間(以秒為單位)。

請注意,這些解決方法可能會增加伺服器的負擔,因此在調整這些設定之前,建議先嘗試優化您的 SQL 查詢,或者檢查是否可以在資料庫上增加適當的索引以提高查詢效能3。如果問題仍然存在,那麼再考慮增加等待時間的設定。希望這些資訊對您有所幫助!

某系統 executionTimeout="3600",但仍約 30 秒就發生等候操作已逾時。

********************************************************************************
System.Data.SqlClient.SqlException (0x80131904): 執行逾時到期。

除了修改 command.CommandTimeout = 120; 
或修改 web.config 或 Machine.config 檔案中的 executionTimeout 屬性的值:
可以用 SSMS 修改 SQL Server 2019 本身的設定嗎? 
ChatGPT
是的,您可以透過 SQL Server Management Studio (SSMS) 修改 SQL Server 2019 的執行逾時設定。這個設定稱為「Remote Query Timeout」,可以在 SSMS 中進行設定,以調整 SQL Server 對於遠端查詢的逾時時間。

以下是如何在 SSMS 中設定 Remote Query Timeout 的步驟:
  1. 使用 SQL Server Management Studio 連接到您的 SQL Server 2019 實例。
  2. 在 SSMS 中,點擊左上角的「工具」選項。
  3. 在下拉選單中,選擇「選項」。
  4. 在「選項」對話框的左側窗格中,展開「查詢執行」。
  5. 點擊「SQL Server」。
  6. 在右側窗格中,您會看到一個選項標籤,名為「Remote Query Timeout」。
  7. 在「Remote Query Timeout」旁邊的文本框中,輸入您希望設定的遠端查詢逾時值(以秒為單位)。
  8. 設定完成後,按下「確定」以保存您的更改。

透過以上步驟,您就可以在 SSMS 中修改 SQL Server 2019 的 Remote Query Timeout 設定,而不需要直接修改 web.config 或 Machine.config 檔案。這樣一來,您就可以調整 SQL Server 對於遠端查詢的逾時時間,以滿足您的應用程式或系統的需求。
********************************************************************************
System.Data.SqlClient.SqlException (0x80131904): 執行逾時到期。

除了修改 command.CommandTimeout = 120; 
或修改 web.config 或 Machine.config 檔案中的 executionTimeout 屬性的值:
可以用 SSMS 修改 SQL Server 2019 本身的設定嗎?

Copilot
這個錯誤訊息表明在連接到 SQL Server 時發生了一個網路相關或特定實例的錯誤。讓我們來探討一下解決方案:

一、修改 SQL Server 設定:
你可以使用 SQL Server Management Studio (SSMS) 來修改 SQL Server 2019 的設定。以下是一些步驟:
1.打開 SSMS。
2.連接到你的 SQL Server 2019 實例。
3.在導航窗格中,展開「伺服器屬性」。
4.選擇「安全性」。
5.在「Server authentication」下,選擇「SQL Server with Windows Authentication mode」。
6.儲存更改。
這樣重新配置身份驗證模式可能有助於解決 0x80131904 錯誤。

二、調整 SSMS 執行逾時設定:
在 SSMS 中,你可以設定執行查詢的逾時時間。以下是步驟:
1.點擊「工具」。
2.選擇「選項」。
3.在左側選擇「查詢執行」。
4.在右側的「執行逾時」中設定適當的時間。
希望這些解決方案能對你有所幫助!如果你有其他問題,請隨時詢問。

參考

下圖,敝人以 SQL Server 2022 Standard + SSMS 20.2 ( SQL Server Management Studio 20.0 ) 實際檢視






也就是 SQL Server 預設是不會逾時,所以逾時發生應該是 ASP.NET 網站 或 IIS 這邊的預設。

********************************************************************************
用 SSMS 檢查 SQL Server 後,發現預設不會逾時,請問 System.Data.SqlClient.SqlException (0x80131904): 執行逾時到期。 除了 web.config 或 Machine.config 檔案中的 executionTimeout 屬性的值 有影響,IIS 本身是否也有相關的設定 ?

Copilot
關於 SQL Server 2019 的逾時問題,除了 web.config 或 Machine.config 檔案中的 executionTimeout 屬性外,IIS 本身也有相關的設定。讓我們來探討一下:

IIS 連線逾時設定:
1.在 IIS 中,你可以設定連線的逾時時間。以下是步驟:
2.打開 IIS 管理員。
3.在左側導航窗格中,選擇你的站點。
4.點擊「進階設定」。
5.在「連線限制」選項下,你可以設定連線的逾時時間。

IIS 的其他相關設定:
HTTP Keep-Alive:如果啟用,則這個設定會影響連線保持的時間,即連線保持活躍的時間。這與「請求逾時」(即 IIS 等待頁面執行的時間)不直接相關。
Request Timeout:如果你的腳本執行時間超過這個設定,IIS 可能會返回 500 內部伺服器錯誤。

https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/e1f13641(v=vs.85)?redirectedfrom=MSDN
https://stackoverflow.com/questions/2414441/how-to-increase-request-timeout-in-iis
https://stackoverflow.com/questions/26135346/sql-connection-error-system-data-sqlclient-sqlexception-0x80131904
********************************************************************************
用 SSMS 檢查 SQL Server 後,發現預設不會逾時,請問 System.Data.SqlClient.SqlException (0x80131904): 執行逾時到期。 除了 web.config 或 Machine.config 檔案中的 executionTimeout 屬性的值 有影響,IIS 本身是否也有相關的設定 ?
ChatGPT
是的,除了 web.config 或 Machine.config 檔案中的 executionTimeout 屬性外,IIS(Internet Information Services)本身也有相關的設定,可以影響 ASP.NET 應用程式的執行逾時。

在 IIS 中,有一個名為「RequestTimeout」的設定,它會影響到所有在該伺服器上執行的 ASP.NET 應用程式。這個設定可以指定在收到 HTTP 請求後,IIS 等待相應完成的最長時間。

您可以透過以下步驟在 IIS 中設定 RequestTimeout:

  1. 打開 IIS Manager。
  2. 在左側窗格中,展開您的伺服器節點,然後展開「站台」。
  3. 選擇您要設定的站台。
  4. 在右側窗格中,找到「請求範例」並雙擊。
  5. 在「請求範例」對話框中,您可以看到「閒置時間限制(分鐘)」,這就是 RequestTimeout 設定。
  6. 將這個值修改為您希望的逾時時間(以分鐘為單位)。
  7. 完成後,點擊「確定」以保存您的更改。

透過這個設定,您可以調整 IIS 對於所有 ASP.NET 應用程式的請求的逾時時間。這樣一來,您就可以確保即使在預設值之外,ASP.NET 應用程式也不會因為逾時而引發 System.Data.SqlClient.SqlException。
********************************************************************************
能在某特定 .aspx 網頁中 SqlDataSource 設定較長逾時時間,其他網頁正常預設值 ? 


<asp:SqlDataSource ID="MySqlDataSource" runat="server" ConnectionString="<Your Connection String>"
    SelectCommand="SELECT * FROM YourTable" CommandTimeout="60">
</asp:SqlDataSource>


    'System.Web.UI.WebControls.SqlDataSource' 沒有名為 'CommandTimeout' 的公用屬性。

    ********************************************************************************
    其他解法 (實際測試 Compile 可過)


    <connectionStrings>
        <add name="DbConnectionString" connectionString="Data Source=資料庫來源;Initial Catalog=資料庫名稱;User ID=帳號;Password=密碼;Connect Timeout=180" providerName="System.Data.SqlClient" />
    </connectionStrings>



      預設值:Connect Timeout 的預設值為 15 秒。
      單位:Connect Timeout 的單位是 秒。
      最小值:Connect Timeout 的最小值為 0 秒。設定為 0 時,表示無限期等待,直至連接成功或失敗。
      最大值:Connect Timeout 的最大值沒有明確的限制,但過大的值(例如數百或數千秒)可能會導致應用程序在連接失敗時長時間等待,影響性能和使用者體驗。


      *****
      其他解法 (實際測試 Compile 可過)



      protected void SqlDataSource_PSearch_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
      {
          e.Command.CommandTimeout = 900; // 設定為 900 秒
      }



        'S
        ********************************************************************************
        (完)

        相關

        沒有留言:

        張貼留言