我正在使用System.Net.WebClient
在异步模式下执行某些HTTP操作。使用异步操作的原因最重要的是,我获得了进度更改指示 - 这仅适用于异步操作,如the docs所述。
所以,假设我已经设置了WebClient:
this.client = new WebClient();
this.client.UploadStringCompleted +=
new UploadStringCompletedEventHandler(textUploadComplete);
和代表:
private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e)
{
if (e.Error != null)
{
// trigger UI failure notification
return;
}
// FIXME not checking for response code == 200 (OK)
// trigger UI success notification
}
所以你看,我假设如果没有引发异常,请求总是成功的(可能不是这种情况,因为HTTP响应状态代码可以是!= 2xx)。从UploadFileAsync上的文档中我无法判断是否也处理了非200响应。
我非常新到C#,我似乎无法找到一种方法来访问该特定异步请求响应的标头。在我看来,每个WebClient
只能在任何给定时间持有响应(或一组标题)。
虽然我不打算同时执行多个并行请求,但我仍然想知道是否有更优雅的方法来检索特定请求的响应头/状态代码,而不是必须得到来自WebClient
的“最后可用”回复。
感谢。
答案 0 :(得分:0)
您是否使用.NET 4.5?如果是这样尝试使用TaskAsync重载...你仍然需要从WebClient实例访问头文件,但我根本不会发现使用TAP工作流程这令人反感......我同意这样做有点不对它在普通的事件处理程序中。
await client.UploadStringTaskAsync(...);
var headers = client.ResponseHeaders;
最重要的是,你可以在UI线程上完成所有操作...不会阻止...所以你的触发更新UI'实际上只是“更新用户界面”。
答案 1 :(得分:0)
从发件人对象中获取标头 我刚刚在您的代码上方添加了一行
private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e)
{
var headers = (sender as WebClient)?.ResponseHeaders; //HEADERS
if (e.Error != null)
{
// trigger UI failure notification
return;
}
// FIXME not checking for response code == 200 (OK)
// trigger UI success notification
}