2008-09-24 60 views
5

我們正在編寫一個搜索應用程序,它將搜索條件保存到會話狀態並在asp.net更新面板中執行搜索。有時當我們連續執行多次搜索時,第二次或第三次搜索有時會返回第一組搜索條件的結果。例如:我們的第一個搜索我們查看「John Smith」 - > John Smith的結果。第二次搜索我們查看「Bob Jones」 - > John Smith結果。ASP.NET Ajax - Asynch請求具有單獨的會話?

正如我所說的,我們將所有搜索條件保存在會話狀態中,並從ajax請求中的會話狀態中讀取它以格式化數據庫查詢。當我們在VS中放置斷點時,所有行爲都是正常的,但沒有它們,我們會得到原始的搜索條件和結果。

我的猜測是因爲他們被保存在會話中,ajax請求以某種方式獲取自己的會話並將標準保存到該會話中,然後每次從該會話中檢索條件,但非異步的東西能夠看看標準何時被修改,並將更改保存爲相應狀態,但由於它們來自兩個不同的會話,因此保存和讀取的內容存在差異。

編輯::: 爲了詳細說明,有人建議將查詢條件附加到查詢字符串,這通常是很好的做法,我同意它應該如何,但遵循我們的要求,我不認爲它是可行。他們希望用戶填寫輸入控件命中搜索,並且沒有頁面重新加載,他們唯一看到的是頁面上的進度指示器,他們仍然能夠導航並使用當前頁面上的其他功能。如果我將條件添加到查詢字符串,我將不得不做另一個請求,導致整個頁面加載,這取決於搜索條件可能需要很長時間。這就是爲什麼我們使用ajax調用來執行搜索以及爲什麼我們不會導致另一個完整頁面請求.....我希望這可以澄清情況。

回答

4

有沒有正常的ASP.NET頁面加載,回發和ASP.NET AJAX部分回發之間的多個會話。我可以肯定地告訴你。

而不是將搜索字符串存儲在會話中,那麼直接使用搜索TextBox的內容怎麼樣?我想不出有什麼理由需要對其進行洗牌,因爲無論如何,它在整個頁面生命週期中都可用。

最後,關於您的要求...使用UpdatePanel確實不是滿足您的用戶應該能夠使用頁面上的其他功能,如果該功能也引發部分回發的要求。一次只能進行一次部分回發。如果在搜索過程中發生了另一個事件,則搜索請求將被取消而不會有任何通知。

使用頁面方法或網絡服務進行搜索將是一個更快,更簡單,更可靠的方法。我通常不插我自己的網站,但我想了幾個我的帖子是你在做的究竟是什麼有關:

你可以使用一個用戶控件呈現通過Web服務的搜索結果(大快於一個UpdatePanel):http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

或者,你可以將搜索結果JSON和渲染在客戶端(甚至更快):http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to-build-a-client-side-repeater/

無論這些方法可以把你的搜索功能出來的部分回發模式,以便運行速度更快,使用更少的帶寬和服務器資源,並且不會妨礙其他UpdatePanel活動同時發生。

4

您需要爲正在調用的函數設置WebMethod屬性的EnableSession屬性。

[WebMethod(EnableSession=true)] 
public static void DoSomething(){ 
    /// .... 
} 
+0

得出這不是一個web服務。 – 2008-09-24 15:35:22

+0

工作就像一個魅力!在VB.NET中: wayofthefuture 2013-12-28 17:13:36

5

又一個思想,我一直運行到與UpdatePanel的問題,並且更喜歡直接寫通過庫我的圖集Ajax請求,使用PageMethods。您對發送和接收的內容有更多的控制權。 UpdatePanel發送整個頁面,並接收整個頁面控件heirarchy,然後解析出「新鮮」並顯示它。

編輯:你用來將標準保存到會話中的代碼是什麼?你有沒有在方法中的代碼,實際上檢查會話是否有一些保存的標準,並將其傳遞回來呢?也許這就是爲什麼第二/第三個更新面板回發返回第一組標準而不是預期結果的原因?順便說一下,我知道從做一些沉重的地圖集ajax的東西,肯定不會有兩個會話(一個用於普通回發,一個用於異步)有沒有機會使用webfarm?

編輯#2:我不會已經能夠寫什麼我寫上面(第一對),如果我沒有得到別人的粉絲誰回答還有:https://stackoverflow.com/users/60/dave-ward

0

如果您使用通用處理器ashx的,剛剛從IRequiresSessionState接口

public class ActionRequest : IHttpHandler, IRequiresSessionState 
{ 
}