Web客户没有得到响应uri

时间:2016-12-09 18:40:32

标签: c# .net httpclient webclient

我在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

1 个答案:

答案 0 :(得分:1)

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

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

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