使用异步WebClient请求获取HTTP头

8
我正在使用System.Net.WebClient以异步模式执行一些HTTP操作。使用异步操作的原因是,最重要的是,我可以获得进度更改指示 - 正如文档所述,这仅适用于异步操作。

假设我已经设置好了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获取“最后可用”的响应。
谢谢。

你正在使用.NET 4.5吗?如果是,请尝试使用TaskAsync重载...您仍需要从WebClient类访问标头,但是我不会在使用TAP工作流时发现这个有任何异议...我同意在普通事件处理程序中执行此操作感觉有点不对。await client.UploadStringTaskAsync(...); var headers = client.ResponseHeaders; - TCC
2个回答

1

从发送方对象中获取头信息 我刚刚在你上面的代码中添加了一行

  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
        }

0

你在使用.NET 4.5吗?如果是的话,尝试使用TaskAsync重载...你仍然需要从WebClient实例访问头文件,但是使用TAP工作流程我不会觉得有任何反感...我同意在普通事件处理程序中这样做感觉有点不对。

await client.UploadStringTaskAsync(...); 
var headers = client.ResponseHeaders; 

最棒的是你可以在UI线程上完成所有操作......不会阻塞......所以你的“触发更新UI”实际上就是“更新UI”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接