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中