【问题标题】:Webclient not getting response uriWebclient没有得到响应uri
【发布时间】:2016-12-09 18:40:32
【问题描述】:

我在webclient 类中发现了一个奇怪的行为。当我使用 UploadValues() 同步方法时,我通常会得到响应 uri,但是当我使用异步版本 UploadValuesTaskAsync() 到相同的 url 时,它会将响应 uri 返回为 null。为什么?

例子:

using (var client = new CustomWebClient())
{
    await Get(client);
    Get(client);
}

private async Task GetAsync(WebClient client)
{
      var resAsync = await client.UploadValuesTaskAsync("http://address.com", requestData); 
      //client.ResponseUri null here
}

private void Get(WebClient client)
{
    var res= client.UploadValues("http://address.com", requestData); 
     //client.ResponseUri **not** null here
}

在GetAsync 方法中,client.ResponseUri 为空,UploadValues 不为空。

编辑:

我发现 WebClient 是“定制的”:

所以类是:

 public class CustomWebClient : WebClient
 {
    public CookieContainer Cookies { get; private set; }
    public Uri ResponseUri { get; private set; }

    public CustomWebClient()
    {
        Cookies = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address) as HttpWebRequest;
        if (request == null)
        {
            return base.GetWebRequest(address);
        }
        request.CookieContainer = Cookies;
        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        var response = base.GetWebResponse(request);
        ResponseUri = response.ResponseUri;
        return response;
    }
}

我在synchronous 方法中检查了它在继续到下一行之前命中GetWebResponse 方法。但是在asynchronous 版本中,它永远不会达到GetWebResponse。

【问题讨论】:

  • 您可能希望将 GetAsync 更改为 void 以使两个示例保持一致
  • 从异步方法返回 void 不是一个好习惯
  • 您究竟是从哪里读取 ResponseUri 的?
  • 我在任何地方都看不到 ResponseUri 属性。您使用的是哪个版本的框架?
  • @Juan 你是对的,我在这里检查并发现网络客户端是“定制的”。我把CustomWebClient代码放在OP中

标签: c# .net httpclient webclient


【解决方案1】:

您的自定义类仅覆盖同步 WebResponse GetWebResponse(WebRequest request) 方法的行为。

您需要为异步版本添加覆盖:

 protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
 {
     var response = base.GetWebResponse(request, result);
     ResponseUri = response.ResponseUri;
     return response;
 }

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 2016-01-09
    • 2021-06-30
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多