Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTTPClient every time returns the same string

Could some one make me clear why my code returns the same string every time?

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;

So every 5 seconds I get the same string that I got in my first request. What am I doing wrong?

like image 450
SABlyu Avatar asked Feb 08 '14 08:02

SABlyu


3 Answers

It's because you're doing a GET to the same URL. According to the HTTP semantics, the value should be the same within a reasonable timeframe, so the OS is caching the response for you.

You can bypass the cache by any of these methods:

  • Using a POST request.
  • Adding a query string parameter that is different for each call.
  • Specifying (on the server) response headers that disable or limit the caching allowed.
like image 138
Stephen Cleary Avatar answered Oct 25 '22 07:10

Stephen Cleary


If you are using Windows.Web.Http.HttpClient, you can skip the local cache this way:

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();

You will never get the same response twice again :)

But if you have access to the server source code, the most elegant fix would be to disable the cache for the URI you are downloading, i.e., add the Cache-Control: no-cache header.

like image 41
kiewic Avatar answered Oct 25 '22 07:10

kiewic


I tried everything, this one worked for me. Just in case some is not able to make it work:

var uri = new Uri("http://192.168.4.160:8081/v?time=" + DateTime.Now);

like image 32
pvma Avatar answered Oct 25 '22 07:10

pvma