Webclient + UploadStringAsync + Events: UploadProgressChange



我需要与REST服务通信。

出于某些原因,我必须使用POST请求从该服务获取 JSON 数据。(我认为它应该使用 GET 请求,但这不在我的控制范围内,我无法更改它......

一个请求的响应约为 25-30 MB。 由于响应很大,我决定使用WebClient和UploadStringAsync方法。

private string jsonResult = "";
void test()
{
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + passowrd));  
using (System.Net.WebClient client = new System.Net.WebClient())
{
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressHandler);
client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompletedHandler);                
client.Headers.Add("Authorization", "Basic " + credentials);
client.Encoding = System.Text.Encoding.UTF8;
Uri uri = new Uri(https://demoapi.org/stuff/prod/0);
client.UploadStringAsync(uri, "POST", "");
}
}
private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine("DOWNLOAD_PROGRESS!");
Console.WriteLine("Status {0} of {1} bytes. {2} % complete", e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage);
}
private static void client_UploadProgressHandler(object sender, UploadProgressChangedEventArgs e)
{
Console.WriteLine("UPLOAD_PROGRESS!");
Console.WriteLine("Status {0} of {1} bytes. {2} % complete, {3} of {4} bytes. {5} % complete", e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage, e.BytesSent, e.TotalBytesToSend, e.ProgressPercentage);
}
private void client_UploadStringCompletedHandler(Object sender, UploadStringCompletedEventArgs e)
{
Console.WriteLine("UPLOAD_COMPLETED!");
jsonResult = e.Result;
}

使用上面的代码,控制台多次显示消息UPLOAD_PROGRESS! 一旦消息UPLOAD_COMPLETED!但是,我没有看到DOWNLOAD_PROGRESS消息!

UPLOAD_PROGRESS!
UPLOAD_PROGRESS!
....    
UPLOAD_PROGRESS!
UPLOAD_COMPLETED!

以下是我的问题:

1)我可以(真的)使用网络客户端订阅"UploadProgressChanged"事件吗?上传字符串异步方法 ?

Microsoft文档并没有说 UploadProgressChanged 可用于 UploadStringAsync,但无论如何它似乎可以使用上面的代码。

https://learn.microsoft.com/en-us/dotnet/api/system.net.webclient.uploadprogresschanged?view=netframework-4.7.2

https://learn.microsoft.com/en-us/dotnet/api/system.net.webclient.uploadstringasync?view=netframework-4.7.2

我也看了Microsoft参考资料,但我不完全理解它。 委托"UploadProgressChanged"似乎不存在在 UploadStringAsync 方法中。

https://referencesource.microsoft.com/#System/net/System/Net/webclient.cs,d15a560fedc713da,references

所以,我想知道在网络客户端上使用"上传进度更改"是否正确。上传字符串异步。

2) 我可以通过网络客户端订阅"DownloadProgressChanged"事件吗?上传字符串异步方法 ?

3)据我了解,Web客户端正在使用WebRequest和WebResponse。是否可以获取两个请求的进度?

我问这个是因为有时请求的主体很大,有时响应很大。

4) 如果 DownloadProgressChangedEvent 不可用,则 如何报告"UploadStringAsync"POST请求的WebResponse部分的进度?

谢谢

上面的代码会上传,因此无法接收 DownloadProgressChanged 事件。

该规则是所有下载或上传异步方法引发相应的下载或上传进度更改事件。在场景下,UploadStringAsync 使用的代码与 UploadDataAsync 使用的代码相同(因为字符串是字符编码的字节数组)。

非异步方法不会引发进度事件。

如果要访问底层 WebRequest,只需创建一个派生自 WebClient 的类并覆盖受保护的虚拟 GetWebRequest(Uri 地址) 方法,如下所示:

public class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
var request = base.GetWebRequest(address);
// do something with the request
// BTW, this is how you can change timeouts or use cookies
return request;
}
}

请注意,您还可以使用更现代的HttpClient类(完全跨平台,框架等)而不是WebClient。

相关内容

  • 没有找到相关文章

最新更新