我有一個ASP.Net網站,我正在從遠程站點下載大型zip文件到服務器。此文件是而不是轉移到客戶端,但將保留在服務器上。我想爲使用SignalR的用戶提供進度更新。當我使用下面的代碼:在SignalR Hub中提供下載進度
public class InstallController : Hub
{
public void Send(string message)
{
Clients.All.AddMessage(message);
}
public void FileDownload()
{
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadFileAsync(new Uri("http://someserver.com/install/file.zip"), @"\file.zip");
}
/* callbacks for download */
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn/totalBytes * 100;
this.Send(String.Format("Download progress: {0}%", percentage.ToString()));
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
this.Send("Finished downloading file...");
}
}
我得到異常:
一種類型的「System.InvalidOperationException」發生在 System.Web.dll中,但在用戶代碼
沒有處理異常其他信息:此時,異步操作無法在 處啓動。異步操作只能在 異步處理程序或模塊內或在生命週期中的某些事件期間啓動。如果在執行頁面時發生此異常,請確保 頁面標記爲<%@ Page Async =「true」%>。這個異常可能是 也表示嘗試調用「async void」方法,該方法在ASP.NET請求處理中通常不支持 。相反,異步方法應該返回一個Task,並且調用者應該等待 它。
我見過幾個提到使用HttpClient而不是WebClient,但我沒有看到如何從中獲得進展。
你可以發佈完整的代碼:至少在這個代碼駐留的方法聲明? –
你也不應該使用signalR來解決這個問題。 並且你能否澄清這句話: _I正在從遠程站點下載一個大的zip文件到服務器。當你只是想讓客戶端下載它時,爲什麼要在服務器上下載文件!提供他的鏈接,而不是。 –
該文件將保留在服務器上。它用於安裝服務器組件。 – edmistj