2014-02-08 6 views
5

Может ли кто-нибудь объяснить мне, почему мой код возвращает одну и ту же строку каждый раз?HTTPClient каждый раз возвращает ту же строку

public MainPage() 
{ 
    this.InitializeComponent(); 

    DispatcherTimer timer = new DispatcherTimer(); 
    timer.Interval = TimeSpan.FromSeconds(5); 
    timer.Tick += OnTimerTick; 
    timer.Start(); 
} 

private void OnTimerTick(object sender, object e) 
{ 
    getData(); 
    HubText.Text = dumpstr; 
} 

private async void getData() 
{ 
    // Create an HttpClient instance 
    HttpClient client = new HttpClient(); 
    var uri = new Uri("http://192.168.4.160:8081/v"); 
    try 
    { 
     // Send a request asynchronously continue when complete 
     HttpResponseMessage response = await client.GetAsync(uri); 
     // Check that response was successful or throw exception 
     response.EnsureSuccessStatusCode(); 
     // Read response asynchronously 
     dumpstr = await response.Content.ReadAsStringAsync(); 
    } 
    catch (Exception e) 
    { 
     //throw; 
    } 
} 
string dumpstr; 

Так каждые 5 секунд я получаю ту же строку, что и в моем первом запросе. Что я делаю неправильно?

+1

Ну, вы действительно не дожидаетесь, пока не получите * свои данные, прежде чем отображать их. Вам было бы лучше сделать метод 'getData()' методом async 'Task ', тогда ваш обработчик тикового таймера также может быть асинхронным, с телом' HubText.Text = await getData(); '. В настоящее время я ожидаю, что вы увидите следующее значение 5 секунд слишком поздно. Но поскольку вы не сказали нам ничего о том, что означает URL, чтобы вернуться, мы не знаем, почему это изменилось. –

+0

Я нашел еще один способ: использовать System.Net.Http для Windows.Net.Http; – SABlyu

ответ

8

Это потому, что вы делаете GET с тем же URL-адресом. Согласно семантике HTTP, значение должно быть одинаковым в разумные сроки, поэтому ОС кэширует ответ для вас.

Вы можете обойти кэш любым из этих способов:

  • Используя запрос POST.
  • Добавление параметра строки запроса, который отличается для каждого вызова.
  • Задание заголовков ответа (на сервере), которые запрещают или ограничивают кеширование.
14

Если вы используете Windows.Web.Http.HttpClient, вы можете пропустить локальный кэш, таким образом:

Windows.Web.Http.Filters.HttpBaseProtocolFilter filter = 
    new Windows.Web.Http.Filters.HttpBaseProtocolFilter(); 
filter.CacheControl.ReadBehavior = 
    Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent; 

HttpClient client = new HttpClient(filter); 
Uri uri = new Uri("http://example.com"); 
HttpResponseMessage response = await client.GetAsync(uri); 

response.EnsureSuccessStatusCode(); 
string str = await response.Content.ReadAsStringAsync(); 

Вы никогда не получите тот же ответ снова дважды :)

Но если у вас есть доступ к исходный код сервера, самым изящным решением было бы отключить кеш для загружаемого URI, то есть добавить заголовок Cache-Control: no-cache.

+0

По умолчанию HttpCacheReadBehavior применяет RFC 2616, но мне нравится, чтобы HTTP 304 возвращался с сервера, поэтому вам нужно настроить эту часть: https://msdn.microsoft.com/library/windows/apps/windows.web. http.filters.httpcachereadbehavior.aspx – a7drew

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