Silverlight中的securityException:对话框必须是用户启动的

时间:2011-08-05 15:57:52

标签: silverlight webclient

我正在尝试创建一个Silverlight应用程序,用于下载URL访问的文件。我尝试使用WCF,但现在我正在尝试使用Webclient。 当我尝试使用此示例代码时,我收到一个securityException错误,指出“对话必须是用户启动的”。 有人可以解释一下我做错了什么吗?感谢。

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        #region Constructors
        public MainPage()
        {
            InitializeComponent();

           // SaveFileDialog sfd = new SaveFileDialog();

        }
        #endregion

        #region Handlers

        void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            if ((bool)sfd.ShowDialog())
            {
                StreamReader sr = new StreamReader(e.Result);
                string str = sr.ReadToEnd();

                StreamWriter sw = new StreamWriter(sfd.OpenFile());
                sw.Write(str);
           }
        }

        private void download_Click_1(object sender, RoutedEventArgs e)
        {
            WebClient webClient = new WebClient();
            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
            webClient.OpenReadAsync(new Uri("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg", UriKind.Absolute));
        }
        #endregion
    }
}

1 个答案:

答案 0 :(得分:1)

旧问题的答案指出的基本问题是OpenReadCompleted事件与按钮点击异步发生。 Silverlight无法确保事件处理程序中的代码是用户操作的结果。

需要做些什么来扭转局面,让用户在调用下载之前选择保存目标。这是一个处理批次的按钮点击事件: -

private void Button_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog sfd = new SaveFileDialog();
    if (sfd.ShowDialog() ?? false)
    {

        WebClient client = new WebClient();
        client.OpenReadCompleted += (s, args) =>
        {
            using (Stream output = sfd.OpenFile())
            {
                args.Result.CopyTo(output);
                output.Flush();
            }
        };
        client.OpenReadAsync(new Uri("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg", UriKind.Absolute));
    }
}
顺便说一句,如果你成功使用StreamReader / StreamWriter可能会搞砸了,这些都是用来读写文本的。在这种情况下,对CopyTo的简单调用可以解决问题。