4

我使用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);
}

因此,此方法在同一ViewModel中调用另一个方法“ WebServiceGetCommentList() ”来准备对 WebService 的调用:

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,则会将更改考虑在内。

=>我认为client.GetAsync()上有一个缓存,但我不知道如何取消它,或者强制它刷新数据......

我尝试了这个对我不起作用的解决方案httpclient-caching 。

我认为当我有缓存管理原因时

4

1 回答 1

2

这就是平台缓存。我对 Cache-Control 标头没有任何成功,解决该问题的最可靠方法是确保请求不同。

添加一个附加参数 - 时间戳。由于请求不同,平台无法使用缓存的响应。

parametres.Add(new KeyValuePair<string, string>("mytmstmp", DateTime.Now.Ticks);

或者:使用允许日期的附加标题。我用过:

"If-Modified-Since", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)
于 2015-10-01T10:25:06.213 回答