2014-02-08 5 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()'메소드를 비동기'Task '메소드로 만드는 것이 더 좋을 것입니다. 타이머 틱 핸들러는'HubText.Text = await getData();'본문과 함께 비동기적일 수 있습니다. 현재 나는 5 초가 지나서 다음 값을 보길 기대합니다. 그러나 URL이 무엇을 반환 할 것인지에 대해 알려주지 않았으므로 왜 변경 될지 알 수 없습니다. –

+0

한 가지 더 많은 방법을 발견했습니다. Windows.Net.Http에 대해 System.Net.Http를 사용했습니다. – SABlyu

답변

8

동일한 URL에 GET을 수행했기 때문입니다. HTTP 의미론에 따르면, 합리적인 기간 내에 값이 동일해야하므로 OS가 응답을 캐싱합니다.

이러한 방법을 통해 캐시를 우회 할 수있다 :

  • 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

관련 문제