windows phone 8.1 中 HttpClient.GetStringAsync 方法的问题

Posted

技术标签:

【中文标题】windows phone 8.1 中 HttpClient.GetStringAsync 方法的问题【英文标题】:Issue with HttpClient.GetStringAsync method in windows phone 8.1 【发布时间】:2015-04-16 09:30:49 【问题描述】:
private async void refresh_Tapped(object sender, TappedRoutedEventArgs e)

    httpclient.CancelPendingRequests();
    string url = "http://gensav.altervista.org/";
    var source = await httpclient.GetStringAsync(url); //PROBLEM
    source = WebUtility.htmlDecode(source);
    HtmlDocument result = new HtmlDocument();
    result.LoadHtml(source);

    List<HtmlNode> toftitle = result.DocumentNode.Descendants().Where
                                (x => (x.Attributes["style"] != null
                                       && x.Attributes["style"].Value.Contains("font-size:14px;line-height:20px;margin-bottom:10px;"))).ToList();

    var li = toftitle[0].InnerHtml.Replace("<br>", "\n");
    li = li.Replace("<span style=\"text-transform: uppercase\">", "");
    li = li.Replace("</span>", "");
    postTextBlock.Text = li;

这段代码所做的基本上是从网站中检索一个字符串(HTML 源代码在之后被解析)。每当我单击按钮时都会执行此代码:第一次单击它时它可以正常工作,但是第二次我认为该方法(GetStringAsync)返回一个未完成的任务,然后使用 source。确实,我的 TextBlock 没有更新。

有什么办法吗?

【问题讨论】:

我认为方法 (GetStringAsync) 返回一个未完成的任务 这不太可能。你确定你调试正确吗?你怎么称呼这段代码? 我在“Tapped”事件的事件处理程序中调用它 你能添加那个代码吗? 你试过在没有httpclient.CancelPendingRequests()的情况下执行这段代码吗?另外,您似乎总是在查询同一个源站点,您确定这是您想要做的吗? 是的,我试过了,没有任何变化。是的,我想查询同一个站点,因为它总是生成不同的字符串 【参考方案1】:

你可能会得到一个缓存的响应。

希望这对您有用:

httpclient.CancelPendingRequests();

// disable caching
httpclient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");

string url = "http://gensav.altervista.org/";
var source = await httpclient.GetStringAsync(url);
...

你也可以像这样为你的 url 添加一个无意义的值:

 string url = "http://gensav.altervista.org/" + "?nocahce=" + Guid.NewGuid();

【讨论】:

您在字符串文字中拼错了“nocache”。【参考方案2】:

为了防止 Http 响应被缓存,我这样做(在 WP8.1 中):

HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
filter.CacheControl.ReadBehavior =
            Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent;
filter.CacheControl.WriteBehavior =
            Windows.Web.Http.Filters.HttpCacheWriteBehavior.NoCache;

_httpClient = new HttpClient(filter);

以这种方式初始化您的 HttpClient 以防止缓存行为。

【讨论】:

以上是关于windows phone 8.1 中 HttpClient.GetStringAsync 方法的问题的主要内容,如果未能解决你的问题,请参考以下文章

我如何采取截图编程中的Windows Phone 8.1

当 Windows (phone) 8.1 应用程序在前台时接收并处理通知参数

Geofence windows phone 8.1中触发后台任务的阈值距离

windows phone 8.1 中 HttpClient.GetStringAsync 方法的问题

xml 适用于Windows 8.1和Windows Phone 8.1应用程序的扩展器控件演示。

xml 适用于Windows 8.1和Windows Phone 8.1应用程序的扩展器控件的模板。