2011-03-02 57 views
1

我有一個aspx頁面來執行異步調用。頁面從數據庫獲取數據(在存儲過程中花費30秒),然後將結果返回給客戶端。這是通過一個jQuery文章完成的。Asp.Net異步頁面停止其他請求

問題是,雖然它執行存儲過程30秒,我的網站的其餘部分不能提出任何請求。

<%@ Page Async="true" AsyncTimeout="600" Language="C#"...在.aspx

我.aspx.cs包含:

 private SqlConnection _connection; 
     private SqlCommand _command; 
     private SqlDataReader _reader; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      AddOnPreRenderCompleteAsync(BeginAsyncOperation, EndAsyncOperation); 
     } 

     protected IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state) 
     { 
      IAsyncResult result = null; 
      try 
      { 
       SqlConnectionStringBuilder ConnectionStringBuilder = new SqlConnectionStringBuilder("**MyConnectionStringGoesHere**"); 
       ConnectionStringBuilder.AsynchronousProcessing = true; 
       _connection = new SqlConnection(ConnectionStringBuilder.ConnectionString); 

       _command = new SqlCommand("GetSiteUpdates", _connection) { CommandType = CommandType.StoredProcedure }; 
       _connection.Open(); 
       result = _command.BeginExecuteReader(cb, state); 
       return result; 
      } 
      catch (Exception ex) 
      {} 
      return result; 
     } 

protected void EndAsyncOperation(IAsyncResult ar) 
     { 
      _reader = _command.EndExecuteReader(ar); 
      try{ 
        //Do Code Here 
        //Set Builder string here 
        Response.Clear(); 
        Response.Write(builder.ToString()); 
        _reader.Close(); 
        Response.End(); 
      } 
      catch (System.Threading.ThreadAbortException) 
      { 
       try { _reader.Close(); } 
       catch { } 
      } 
      catch (Exception ex) 
      { 
       try { _reader.Close(); } 
       catch { } 
      } 
} 

回答

5

這樣做的原因是會話鎖定。當頁面打開時,會話的讀寫訪問權限(默認情況下)會鎖定會話,從而阻止需要加載會話的其他任何頁面。

這裏有兩件事。

  1. 快速修復是刪除會話訪問權限和/或將其設置爲只讀此頁面。

  2. 由於您只返回JSON,因此您應該使用ASP.Net處理程序(ashx),因爲這會產生比aspx頁面更少的開銷,並且默認情況下不具有會話訪問權限(如有必要,可以添加它) 。

此外,我不知道你爲什麼在這裏使用異步。由於IIS必須等到頁面返回一個響應,並且由於這個頁面沒有做任何其他的事情,我認爲沒有任何異步使用它的好處。

+0

我決定讓它是異步的,因爲數據庫需要30秒才能返回數據,並且在那30秒內,我希望我的線程在服務器上響應其他用戶的其他請求等。 – Bob

+2

根據http:///msdn.microsoft.com/en-us/library/ms178581.aspx,對不同會話ID的請求可以同時訪問會話。只有另一個相同會話ID的請求才需要等待鎖定。 – mbeckish

+0

謝謝,這正是我需要的 - 用ashx選項。 – Bob

0

您是否針對正確的IIS實例進行測試?如果您正在使用內置於Visual Studio的開發服務器,那麼您將遇到此單線程行爲。

+0

這就是我想在第一,但發佈到IIS後,我仍然有這個問題。 – Bob

+1

雖然Visual Studio開發服務器是不同的(不管設置如何,都由ASP.Net引擎處理),但此類行爲不應與IIS不同。開發服務器允許多線程應用程序沒有問題。 – Kris