2011-04-06 57 views
0

我有一個點網絡Windows應用程序,它將大文件上傳到Intranet網站。雖然上傳工作正常,但我還想知道上傳的進度。使用HttpWebRequest的異步上傳

我看到webRequest.GetResponse()是需要時間的行。該控件幾乎立即從GetRequestStream中出來,我認爲這是本地發生的,不需要服務器連接。

using (var reqStream = webRequest.GetRequestStream()) 
{ 
    reqStream.Write(tempBuffer, 0, tempBuffer.Length); 
} 

我試着將它轉換爲一個異步調用,但它也採取相同的時間來達到RespCallback方法。

IAsyncResult result = (IAsyncResult)webRequest.BeginGetResponse(new AsyncCallback(RespCallback), requestState); 

private void RespCallback(IAsyncResult asyncResult) 
{ 
    WebRequestState reqState = ((WebRequestState)(asyncResult.AsyncState)); 
} 

我想追蹤發送到服務器的字節,以顯示進度條。我怎樣才能做到這一點?

回答

0

將異步上傳想象成一個單獨的線程,一旦它上傳了信息,程序的其餘部分就會運行並且一旦收到響應就會觸發事件處理程序。

您應該使用WebClient類。

因此,例如:

public string result; //Variable for returned data to go. 

public void UploadInfo(string URL, string data) 
{ 

WebClient client = new WebClient(); //Create new instance of WebClient 

client.UploadStringCompeleted += new UploadStringCompletedEventHandler(client_uploadComplete); //Tell client what to do once upload complete 

client.UploadStringAsync(new uri(URL), data); //Send data to URL specified 

} 


public void client_uploadComplete(object sender, UploadStringCompletedEventArgs e) 
{ 

if (e.Error == null) //If server does not return error 
{ 
result = e.Result; //Place returned value into "result" string 
} 

} 

那的代碼只是一個基本的一點,我不確定它是否會爲你工作,因爲這將取決於你使用再加上其他因素,什麼服務器端的技術,但它應該指出你在正確的方向。

如果您正在使用某種服務器端數據交換格式的查找,例如json,則在將信息發送到服務器之前,您需要以下行。

client.Headers[HttpRequestHeader.ContentType] = "application/json"; 

確保您將「application/json」更改爲您正在使用的任何內容。

祝你好運!

+0

@ Joshua-'Cuppers'-Whittle。我不得不重寫很多我的代碼,但WebClient似乎是一個好方法。我不確定這是否是一種好方法,儘管WebClient有一個已知的問題,沒有正確更新進度。 [鏈接](http://stackoverflow.com/questions/4768419/webclient-uploadvaluesasync-not-updating-progress-properly) – 2011-04-06 12:39:09