2015-10-05 57 views
0

預期結果:用戶選擇通過可能需要很長時間的寧靜呼叫下載報告的選項後,會打開一個新選項卡,並顯示消息「請稍候「我想將控制權還給瀏覽器,以便用戶可以從」請稍等「瀏覽器選項卡重新點擊開窗器瀏覽器選項卡並繼續瀏覽網站。我放在一起的代碼會運行,但不會產生所需的結果,它的行爲方式與我的代碼的非異步版本相同 - 也就是說,用戶的開啓器選項卡保持綁定狀態,直到獲得下載的調用完成。我嘗試過其他模式,但所有結果都一樣 - 沒有我期望的異步行爲。我正在努力做什麼,如果是這樣,我不瞭解什麼?在C#中使用MVC 4中的RESTful HTTP請求異步等待

C#代碼:

public class ReportsController : Controller 
    { 
     public async Task GetDownloadAsync(string docId, string docName, string startDate, string endDate, string format) 
     { 
      //make request: 
      HttpWebRequest GETRequest = (HttpWebRequest)WebRequest.Create("http://myServerAddress"); 
      GETRequest.Method = "GET"; 
      GETRequest.ProtocolVersion = HttpVersion.Version11; 
      GETRequest.Accept = CreateHeader(format); 

      Task<WebResponse> getResponseTask = GETRequest.GetResponseAsync(); 
      WebResponse GETResponse = await getResponseTask; 
      (HttpWebResponse)GETRequest.GetResponse(); 
      Stream GETReponseStream = GETResponse.GetResponseStream(); 

      //retrieve response into byteArray: 
      byte[] responseByteArray = convertStreamToByteArray(GETReponseStream); 

      string fileName = string.Format("{0}-{1}.{2}", docName, DateTime.Now.ToString("o"), CreateFileExt(format)); 

      Response.ClearContent(); 
      Response.ContentType = CreateHeader(format); 
      Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 
      Response.AddHeader("Content-Length", GETResponse.ContentLength.ToString()); 

      Response.BinaryWrite(responseByteArray); 

     } 
    } 

我打電話從一些JavaScript的CSHTML鑑於這樣該控制器功能:

var win = window.open(encodeURI("GetDownloadAsync?docId=" + docId + "&docName=" + docName + "&startDate=" + startDate + "&endDate=" + endDate + "&format=" + reportType)); 

回答

0

即使我相信我已經實現異步正常,看來它仍然不起作用。無需實現異步的,我能夠通過操縱手柄的.Net會話狀態的方式來實現所期望的行爲,與裝飾控制器類:

[SessionState(SessionStateBehavior.ReadOnly)] 

這爲我提供了所需的「異步」 -ish行爲,即是啓動映射到控制器方法的選項卡的效果,該方法使RESTful調用下載大文件不再阻止在文件下載時瀏覽網站的其餘部分。

https://msdn.microsoft.com/en-us/library/ms178581%28v=vs.140%29.aspx

訪問ASP.NET會話狀態是每個會話,這意味着 ,如果兩個不同的用戶進行的併發請求,訪問每個 單獨的會話同時授予獨佔。 但是,如果兩個併發的 請求是針對同一會話(通過使用相同的SessionID 值),第一個請求獲得對會話 的獨佔訪問信息。第二個請求僅在第一個請求 完成後才執行。(如果由於第一個請求超出 鎖定超時而釋放信息上的獨佔鎖定 ,則第二個會話也可以訪問。)如果指令中的EnableSessionState值設置爲ReadOnly,則請求對於只讀會話 信息不會導致會話數據上的獨佔鎖。 但是,會話數據的只讀請求可能仍然需要等待 才能清除會話數據的讀寫請求所設置的鎖定。