2016-12-09 7 views
3

Я нашел странное поведение в классе webclient. Когда я использую синхронный метод UploadValues(), я получаю ответ uri обычно, но когда я использую асинхронную версию UploadValuesTaskAsync() на тот же URL-адрес, он возвращает ответ uri как null. Зачем?Webclient не получает ответ 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 
} 

В методе GetAsyncclient.ResponseUri приходит нулевым, а не нулевой для UploadValues.

EDIT:

Я обнаружил, что 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

Вы можете изменить GetAsync к аннулированию просто быть последовательным между этими двумя примерами –

+1

Его не очень хорошая практика, чтобы вернуть пустоту из асинхронном метод – gog

+0

Где именно вы читаете ResponseUri? – JuanR

ответ

1

Ваш индивидуальный класс только переопределяет поведение синхронного метода WebResponse GetWebResponse(WebRequest request).

Вам нужно добавить переопределение для версии асинхронном:

protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) 
{ 
    var response = base.GetWebResponse(request, result); 
    ResponseUri = response.ResponseUri; 
    return response; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^