从服务器下载图像

时间:2011-05-30 11:24:03

标签: image windows-phone-7


我要点击按钮从服务器下载图像。 代码是:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        (sender as Button).IsEnabled = false;
        progressbar.IsIndeterminate = true;
        WebClient w = new WebClient();
        w.OpenReadAsync(new Uri("http://example.com/xxx/image.png"));
        w.OpenReadCompleted += new OpenReadCompletedEventHandler(w_OpenReadCompleted);
    }

    void w_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        progressbar.IsIndeterminate = false;
        BitmapImage b = new BitmapImage();
        b.SetSource(e.Result);
        Image img = new Image();
        img.Source = b;
        LayoutRoot.Children.Add(img);
    }

我面临的问题是,第一次从服务器下载数据并正确显示。但是,如果我退出应用程序并再次启动它,即使我已从服务器删除了图像或更改了图像,它也会下载旧图像。我认为图像在某处缓存但不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

我认为这与您的问题相同:

How do you disable caching with WebClient and Windows Phone 7

使用HttpWebRequest获取数据时,我没有注意到这种行为。但我不确定。

更新:默认情况下,HttpWebRequest具有相同的行为,但可以禁用。这篇博文正在谈论你有的选择: http://www.nickharris.net/2010/10/windows-phone-7-httpwebrequest-returns-same-response-from-cache/

答案 1 :(得分:1)

最后设法修复它。
唯一的变化是:


w.OpenReadAsync(new Uri("http://example.com/xxx/image.png?q="+Guid.NewGuid()));

答案 2 :(得分:-1)

您还可以使用HttpWebRequest在每个请求下载新数据。这是一个设置异步调用的简单类

这是一个简单的http客户端,它将从给定的uri下载数据。

public static class HttpClient
{
    public static void Execute(Uri uri, Action<HttpWebRequest> onrequest, Action<HttpWebResponse> onresponse)
    {
        var request = HttpWebRequest.CreateHttp(uri);

        onrequest(request);

        request.BeginGetResponse
        (
            result =>
            {
                try
                {
                    if (request.HaveResponse)
                        onresponse((HttpWebResponse)request.EndGetResponse(result));
                }
                catch { }
            },
            null
        );
    }
}

将HttpClient与您的按钮点击事件一起使用

private void Button_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).IsEnabled = false;
    progressbar.IsIndeterminate = true;

    HttpClient.Execute
    (
        new Uri(http://example.com/xxx/image.png),

        request =>
        {
            request.UserAgent = "Custom HTTP Client";
        },

        response =>
        {
            progressbar.IsIndeterminate = false;
            BitmapImage b = new BitmapImage();
            b.SetSource(response.GetResponseStream());
            Image img = new Image();
            img.Source = b;
            LayoutRoot.Children.Add(img);
        }
    );
}