我最近推出了一個新的ASP .Net應用程序。此應用程序使用.Net 4.0和實體框架4.它是一個「基本」CRUD應用程序。我幾乎完全使用EntityDataSource進行數據訪問。爲什麼我的新.Net 4.0 EF應用程序會隨機鎖定?
用戶已經報告了應用程序的「ocassional freeze」(它們都使用IE 8)。如果用戶關閉他的瀏覽器並重新開始,那麼應用程序就沒問題。它可能每天發生一次或兩次,通常是重度用戶。 (所以,我一直傾向於內存不足或某種其他類型的資源限制。)
直到就在前一段時間,我從未見過這種情況。它不會在客戶端PC和服務器上的事件日誌中留下任何內容。此外,IIS錯誤日誌或SQL日誌中沒有任何內容。
不久前,我終於發生了。我將所有的EntityDataSources切換爲每頁使用一個對象上下文。我下載了EF Profiler(這似乎是一個很棒的產品),並指出我在很多頁面上使用了多個對象上下文,這是因爲它們中的很多都有多個EntityDataSource。所以,我正在清理所有這一切,並測試每一頁,當你看到.... IE停止加載頁面!
起初,頁面開始加載緩慢(這是一個頁面,我已經修改爲使用單個對象上下文,所以儘管我仍然相信我需要在我的所有頁面中實現這種「單例」模式,但我猜猜它不是罪魁禍首!無論如何..),然後在某些時候我收到:
消息:Sys.WebForms.PageRequestManagerTimeoutException:服務器請求超時。
仍然沒有在事件日誌中。我也檢查了IIS網絡日誌,但沒有看到任何內容,但用肉眼很難閱讀,我可能不得不下載解析器以確保沒有任何內容。
無論如何,我決定啓動另一個窗口並導航到我的應用程序,並確定窗口工作正常,沒有問題。我回到停止響應的窗口,刷新它,等待...去我的應用程序的主頁(這基本上只是一些靜態html ..沒有..)。接下來,我在當前被凍結的窗口中打開了一個新選項卡,該選項卡正常工作。所以,我回到窗口,不能再從我的應用程序加載頁面,並嘗試一些其他網站.... espn.com加載罰款,msn.com加載罰款,然後我輸入我的應用程序主頁的URL(並嘗試在我的應用程序中的其他頁面),但沒有。 IIS甚至不會在其日誌文件中記錄嘗試(就像IE剛剛決定不再做「獲取」我的本地主機!)。最後,在等待一段時間(當我輸入這篇文章的時候),我現在在那個窗口中有這個錯誤信息:
Internet Explorer無法顯示網頁。你可以嘗試:這個問題可能是由各種問題引起的,包括:BLAH BLAH BLAH ...
所以,我跳回到那個窗口,它仍然可以瀏覽Internet站點。但是,當我嘗試訪問我的應用程序中的任何頁面時,我再次遇到任何問題(在標籤中旋轉藍色圓圈)。所以,我再次在同一瀏覽器中啓動一個新選項卡,並且可以很好地瀏覽我的應用程序。
我的應用程序對這個瀏覽器實例做了什麼,它將不再讓它加載它的任何頁面(事實上,它似乎甚至沒有在任何應用程序頁面上進行GET,因爲沒有任何東西新的IIS日誌...除了當我加載頁面在這些其他標籤和/或瀏覽器窗口工作正常,所以日誌記錄仍在工作......)?我將永遠感激可以幫助我解決這個問題的人。我不確定它會有什麼好處,但我會離開這個瀏覽器窗口,因爲有人可以告訴我一些事情來嘗試診斷這個問題。我覺得我很接近想出來。我終於有了一個窗戶,這是行爲不端。我害怕關閉窗口或在應用程序上做一個新的內部版本,直到我得到一些好的輸入來嘗試......
我應該補充一點,當這發生在我身上時,我在本地PC上運行,所以我是唯一的用戶,並只有一個窗口開放的應用程序..
雖然,我完全難倒!
我應該補充一點,當我在上面遇到這種情況時,我在本地PC上運行,所以我是唯一的用戶,只有一個窗口可以打開應用程序.. – Shayne 2011-02-27 19:34:37
我剛剛意識到一些事情......我們有「httpRuntime executionTimeout」值設置爲「1200」(20分鐘,對吧?)。如果我理解正確,並且問題與請求混淆,我是不是可以降低此值,並且頁面會更快放棄?這是否也會釋放或重置這兩個Web瀏覽器連接之一? – Shayne 2011-02-28 01:19:12
即使您是唯一的用戶,您也可以觸發同時發出的請求,但是它在生產中更常見。執行超時設置爲20分鐘聽起來真的太過分了,所以是的,你可以降低它。然而,你也應該找到問題的根源,因爲即使是很小的鎖定(比如90秒)也會令人討厭,更不用說破壞的功能了。 – jishi 2011-02-28 09:19:57