2017-03-08 29 views
0

我正在尋找一些使用Windows.Web.Http.HttpClient類的UWP應用程序的幫助。我是UWP開發新手,所以使用HttpClient也是新的。在UWP應用程序中使用HttpClient需要在第二次調用之前進行第一次調用的結果

我有兩個需要相對較快的Web服務調用。第一次調用需要從用戶輸入,並將結果張貼到數據庫

電話1:

sharedHttpResponseMessage = await sharedHttpClient.PostAsync(resourceUri, new HttpStringContent("")); 

jsonObject = JsonObject.Parse(await sharedHttpResponseMessage.Content.ReadAsStringAsync()); 

的調用上面將一個數據庫上執行一些工作,根據結果的第二個電話會拉數據向用戶顯示一個列表。

召喚2:

sharedHttpResponseMessage = await sharedHttpClient.GetAsync(resourceUri); 

jsonObject = JsonObject.Parse(await sharedHttpResponseMessage.Content.ReadAsStringAsync()); 

發生的第二次調用沒有返回正確的數據的問題。就好像第二次電話獲得結果之前第一次電話還沒有完成。這是HttpClient的工作方式,由於asnyc調用,或者有辦法把它們放在一起,所以它們被稱爲回來?我見過HttpRequestHandler,但不知道這是我需要的答案。

感謝您的任何幫助。

編輯1:這是我打電話的功能。

// This code is called from a button press 
private async void RunSetPromptTest() 
{ 
    getPrompt = "http://internalwebaddress/set_response"; 

    if (!Uri.TryCreate(getPrompt, UriKind.Absolute, out resourceUri)) 
     return; 

    sharedHttpClient.DefaultRequestHeaders.Clear(); 
    sharedHttpClient.DefaultRequestHeaders.Add("pn_user_session_id", "17855"); 
    sharedHttpClient.DefaultRequestHeaders.Add("pv_prompt_type", "set_manual_response"); 
    sharedHttpClient.DefaultRequestHeaders.Add("pv_value", Value.Text); 

    try 
    { 
     sharedHttpResponseMessage = await sharedHttpClient.PostAsync(resourceUri, new HttpStringContent("")); 

     jsonObject = JsonObject.Parse(await sharedHttpResponseMessage.Content.ReadAsStringAsync()); 
     returnStatus = jsonObject.GetNamedString("pv_status_return"); 

     if (returnStatus == "E") 
      Prompt.Text = jsonObject.GetNamedString("pv_message_return"); 
     else 
     { 
      RunGetPromptTest(); 
     } 


     rootPage.NotifyUser("Completed", MainPage.NotifyType.StatusMessage); 

    } 
    catch (Exception ex) 
    { 
     rootPage.NotifyUser("Error: " + ex.Message, MainPage.NotifyType.ErrorMessage); 
    } 
} 


// This code section is called within the above procedure RunSetPromptTest. 
private async void RunGetPromptTest() 
{ 

    getPrompt = "http://internalwebaddress/get_prompt"; 

    if (!Uri.TryCreate(getPrompt, UriKind.Absolute, out resourceUri)) 
     return; 

    sharedHttpClient.DefaultRequestHeaders.Clear(); 
    sharedHttpClient.DefaultRequestHeaders.Add("pn_user_session_id", "17855"); 
    sharedHttpClient.DefaultRequestHeaders.Add("pv_prompt_type", "get_manual_prompt_internal"); 

    try 
    { 
     sharedHttpResponseMessage = await sharedHttpClient.PostAsync(resourceUri, new HttpStringContent("")); 

     jsonObject = JsonObject.Parse(await sharedHttpResponseMessage.Content.ReadAsStringAsync()); 

     Prompt.Text = jsonObject.GetNamedString("pv_message_return"); 
     promptList = jsonObject.GetNamedString("pv_list_return"); 
     Value.Text = string.Empty; 

     getPrompt = "http://internalwebaddress/get_prompt_list"; 

     if (!Uri.TryCreate(getPrompt, UriKind.Absolute, out resourceUri)) 
      return; 

     sharedHttpClient.DefaultRequestHeaders.Clear(); 
     sharedHttpClient.DefaultRequestHeaders.Add("pn_user_session_id", "17855"); 
     sharedHttpClient.DefaultRequestHeaders.Add("pv_prompt_type", "get_manual_list"); 

     sharedHttpResponseMessage = await sharedHttpClient.GetAsync(resourceUri); 

     jsonObject = JsonObject.Parse(await sharedHttpResponseMessage.Content.ReadAsStringAsync()); 

     JsonArray jsonItem = jsonObject.GetNamedArray("items", new JsonArray()); 

     rootPage.NotifyUser("Completed", MainPage.NotifyType.StatusMessage); 

    } 
    catch (Exception ex) 
    { 
     rootPage.NotifyUser("Error: " + ex.Message, MainPage.NotifyType.ErrorMessage); 
    } 
} 
+0

簡而言之,它應該工作,並且問題隱藏在您未分享的細節中。這是什麼意思「它不會返回正確的數據」。你有證據嗎?兩次調用的整個方法是怎樣的? – Liero

+0

沒有看到兩個呼叫的情況下很難說你的問題是什麼 – maccettura

+0

我已經添加了我打電話的代碼。我更新了一下,以更好地反映我所看到的。 –

回答

0

經過相當多的搜索後,從2014年發現了這個線程的分辨率。我有同樣的問題,但沒有意識到這是我發佈時的同一個問題。

HTTPClient every time returns the same string

創建這個固定的緩存數據的問題。

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