我使用 MVVM-Light 开发au Universal App 。
在页面上,有一个来自WebService的评论列表。如果当前用户是评论的作者,我会显示一个FlyoutMenu,允许他“编辑”或“删除”其评论。还有一个用于添加新评论的AppBarButton:
我的问题是,在第一次加载此页面后,评论永远不会刷新...
我在 ViewModel 中使用“ LoadComments() ”方法,这样我就可以在到达页面时收到评论,但也可以在编辑,删除或添加项目之后:
private async void LoadComments()
{
List<Comment> commentsWS = await WebServiceGetCommentList();
if (commentsWS != null)
Comments = new ObservableCollection<Commentaire>(commentsWS);
}
此方法因此调用另一个方法“ WebServiceGetCommentList()”,该方法准备调用WebService,在同一 ViewModel 中:
private async Task<List<Comment>> WebServiceGetCommentList()
{
// Parameters
List<KeyValuePair<string, string>> parametres = new List<KeyValuePair<string, string>>();
parametres.Add(new KeyValuePair<string, string>("option", _currentUserAccount.option));
parametres.Add(new KeyValuePair<string, string>("id_article", Article.id_article.ToString()));
// Call WebService and deserialize
Exception custEx = null;
try
{
List<Comment> comments = await WebServices.GetCommentList(_currentUserAccount.url, parametres, "");
return comments;
}
// Exceptions
catch (Exception e)
{
...
}
return null;
}
然后我在“ WebServices ”类中使用“ GetComments() ”方法:
public static async Task<List<Comment>> GetCommentList(String url, List<KeyValuePair<String, String>> parametres, String protocol)
{
// Call WebService and deserialize
var response = await JSONParser.getJSONFromUrl(url, parametres, "");
List<Comment> comments = new List<Comment>();
WsResponse wsResponse = ManageWsReponse(response, Constants.WebServiceTask.GetCommentList.Value);
try
{
WsResponseResult wsResponseResult = JsonConvert.DeserializeObject<WsResponseResult>(wsResponse.data.ToString());
comments = JsonConvert.DeserializeObject<List<Comment>>(wsResponseResult.result.ToString());
return comments;
}
catch (Exception e)
{
throw new DeserializeException("Deserialize exception", e, DateTime.Now, "Comment");
}
}
此方法调用启动“ client.GetAsync”的“ JSONParser ”类中的“ getJSONFromUrl() ”方法()“:
public static async Task<string> getJSONFromUrl(String url, List<KeyValuePair<String, String>> parameters, String protocol)
{
var client = new HttpClient();
// Preparing URI
string sParameters = null;
int i = 1;
foreach (var param in parameters)
{
sParameters += param.Key + "=" + param.Value;
sParameters += i != parameters.Count ? "&" : string.Empty;
i++;
}
var uri = new Uri(url + "?" + sParameters);
// Calls the WebService
var response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);
// Code and results
var statusCode = response.StatusCode;
// EnsureSuccessStatusCode throws exception if not HTTP 200
response.EnsureSuccessStatusCode();
// responseText
var responseText = await response.Content.ReadAsStringAsync();
return responseText;
}
我可以成功添加,删除或编辑评论,但是当我回到此方法“ LoadComments() ”时,更改不会被采用帐户,我得到的列表与第一次通话时相同......
我还在“ GetJSONFromURL ()”方法中放置了断点,我没有在响应变量中看到添加,删除或编辑的注释。
同时,如果我在浏览器中复制URI,为了使用相同的参数调用相同的WebService,则会考虑更改。
=&GT;我认为在client.GetAsync()上有一个缓存,但是我没有看到如何去除它,或者强制它刷新数据 ......
我尝试了这个对我不起作用的解决方案httpclient-caching。
我认为,当我
时,存在缓存管理原因答案 0 :(得分:2)
这是平台缓存。我没有使用Cache-Control标头取得任何成功,解决问题的最可靠方法是确保请求不同。
添加其他参数 - 时间戳。由于请求不同,平台无法使用缓存的响应。
parametres.Add(new KeyValuePair<string, string>("mytmstmp", DateTime.Now.Ticks);
或:使用允许日期的其他标头。我用过:
"If-Modified-Since", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)