在异步WebClient请求中获取HTTP标头

时间:2010-10-13 10:36:08

标签: c# http asynchronous webclient

我正在使用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的“最后可用”回复。

感谢。

2 个答案:

答案 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
        }