【发布时间】: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