Webclient не получает ответа uri
Я обнаружил странное поведение в классе 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
приходит null, а не null для 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
Никогда.
1 ответ:
Ваш настроенный класс только переопределяет поведение для синхронного метода
WebResponse GetWebResponse(WebRequest request)
.Необходимо добавить переопределение для асинхронной версии:
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) { var response = base.GetWebResponse(request, result); ResponseUri = response.ResponseUri; return response; }