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