1

我有一個ASP.NET WebForm應用程序 - 主持一堆IFRAME「小部件」的主頁面。當主頁面加載時 - 窗口小部件的頁面也會加載並開始自己的處理,其中包括連接到SQL Server以運行存儲過程。取消長時間運行IFRAME

用戶需要這樣做才能取消IFRAME處理的最佳方式是什麼?我可以將他們的SRC設置爲客戶端的另一個/空白頁面,從而取消請求,但是如果IFRAME頁面已經調用了SQL Server - 我如何取消SQL處理?

編輯:澄清在IFRAMEd頁最慢的點是SQL Server存儲過程調用,所以基本上這歸結爲 - 我可以啓動取消客戶端的SQL命令?在我的腦海裏想出了

+1

@Yurjy設置SRC可能會取消在IFRAME中加載頁面,但它可能不會停止當前在Web服務器上運行的線程。這意味着查詢將在服務器上完全運行,然後響應將被丟棄。這是我的假設,我不太確定。我會建議在ASP.net中查看異步編程。以及。 – sallushan

+0

奇怪的事情 - 設置SRC確實會改變頁面,但只是暫時的,當長時間運行完成處理時 - 它再次出現在iframe中。 –

+0

@sallushan - 「probably」?絕對不會。 – Igor

回答

1

一個解決方案是有一個靜態List當前運行SqlCommands,每當用戶調用取消你可以從這個靜態列表中提取命令,然後將其取消。執行該命令的頁面將收到命令cancel異常,然後可以正確處理它。

下面是你需要處理的事情:

  1. 不知怎的,用戶界面應該有一些關鍵的,這樣當你按下取消按鈕,用戶界面將隨後發送鍵取消例程,並取消例程將使用該密鑰提取SqlCommand並調用其方法Cancel
  2. 取消呼叫應通過AJAX做
  3. 適當的鎖應該爲線程安全進行

更新:

我在這裏加入了一些細節,

  1. 這裏是項目的鏈接http://goo.gl/noKUmj
  2. 以上項目是Web窗體應用程序
  3. ,只要你想在這個項目中,您可以添加多個控制器,路由代碼已經在Global.ascx增加,所以新的控制器應努力
  4. 但對於新的IFRAME取消您不必添加另一控制器。你只需要通過PageName(如鑰匙),以取消控制器
  5. 限制:該項目有限制,即如果你打一個IFRAME取消按鈕,它要取消當前所有的請求,這意味着在多用戶環境中,如果一個用戶取消IFRAME-1,則所有IFRAME-1都將被取消。
  6. 您可以輕鬆取消多個IFRAME,因爲您可以看到它正在執行JavaScript代碼的取消按鈕代碼,您只需點擊一次即可呼叫多個取消代碼。

正如你可能已經看到這個項目,它使用PageName作爲重點來提取ListSqlCommand。由於這個原因,我們有上面提到的限制。由於PageName將與多個SqlCommand相同。

爲了克服這個限制,您可以生成一個GUID作爲重點,並通過這個GUIDQueryStringForm1.aspxForm2.aspx頁面,讓他們使用這些GUID S IN List添加的命令。這些密鑰應該在主機頁面呈現時或JavaScript中生成。

如果你不想做RnD,這是更新後的項目,它使用GUID作爲Key。 :) http://goo.gl/I86S7Z

+0

這種方法的問題是,如果當前的HTTP請求正在處理中,我將無法進行AJAX調用 - AJAX調用將不得不等待直到它完成 –

+0

@YuriyGalanter,您是否將取消按鈕放在顯示的同一頁上在IFRAME?我想不,可能你的取消按鈕在主機頁面上,那麼你應該創建一個單獨的處理程序/控制器,它將通過使用AJAX的取消按鈕來調用,這樣就會生成一個單獨的HTTP請求。我有測試項目,你想讓我上傳Google雲端硬盤並分享鏈接嗎? – sallushan

+0

以前從未這樣做過,如果可以共享Webform應用程序的示例,將非常感激。謝謝! –