C# Webclient未获取响应uri

C# Webclient未获取响应uri,c#,.net,httpclient,webclient,C#,.net,Httpclient,Webclient,我在webclient类中发现了一个奇怪的行为。当我使用UploadValues()synchronous方法时,我通常会得到响应uri,但当我对同一url使用异步版本UploadValuesTaskAsync()时,它会将响应uri返回为null。为什么? 例如: using (var client = new CustomWebClient()) { await Get(client); Get(client); } private async Task GetAsync(

我在
webclient
类中发现了一个奇怪的行为。当我使用
UploadValues()
synchronous方法时,我通常会得到响应uri,但当我对同一url使用异步版本
UploadValuesTaskAsync()
时,它会将响应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
方法。但是在
异步
版本中,它不会命中
GetWebResponse
从不。

您的自定义类只是覆盖同步
WebResponse GetWebResponse(WebRequest请求)
方法的行为

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

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

您可能希望将GetAsync更改为void,以便在两个示例之间保持一致。从异步方法返回void不是一个好的做法。您从何处读取ResponseUri?我在任何地方都没有看到ResponseUri属性。你使用的是什么版本的框架?@Juan你说得对,我在这里检查了一下,发现webclient是“定制的”。我将CustomWebClient代码放在OP中