使用HttpWebRequest进行异步上传

时间:2011-04-06 10:52:08

标签: asynchronous upload httpwebrequest

我有一个dot net windows应用程序,它将大文件上传到Intranet网站。虽然上传工作正常,但我也想知道上传的进度。

我看到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));
}

我想跟踪发送到服务器的字节,以便显示进度条。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

你有没有试过WebClient课程?和UploadXXXAsyn()方法?

答案 1 :(得分: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”更改为您正在使用的任何内容。

祝你好运!