我在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
。
答案 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;
}