c# - Webclient 没有得到响应 uri

标签 c# .net httpclient webclient

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

例子:

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

最佳答案

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

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

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

关于c# - Webclient 没有得到响应 uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41066871/

相关文章:

java - http服务器和客户端实现head和get方法

java - Secure iNet Factory 和 Apache httpclient,哪个更强大?

java - org.apache.http.ProtocolException : Target host is not specified

c# - linq Any() 内部是如何工作的

c# - 从类型名称转换为类型作为字符串

c# - TeamsBot - 如何从对话更新事件中获取团队 ID?

c# - 正则表达式的命名空间不起作用

c# - 使用 Entity Framework 向模型添加方法

c# - 动态 CSS - 缓存问题?

c# - 并登录 LinkLabel 文本