【问题标题】:securityException in Silverlight: dialogs must be user initiatedSilverlight 中的 securityException:对话框必须由用户启动
【发布时间】:2011-08-05 15:57:51
【问题描述】:

我正在尝试创建一个 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
    }
}

【问题讨论】:

标签: silverlight webclient


【解决方案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 即可。

【讨论】:

  • 感谢您的帮助,知道为什么我会收到此错误吗? Silverlight 应用程序中的未处理错误 操作过程中发生异常,导致结果无效。检查 InnerException 以获取异常详细信息。在 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 在 System.Net.OpenReadCompletedEventArgs.get_Result() 在 SilverlightApplication1.MainPage.c__DisplayClass2.b__0(Object s, OpenReadCompletedEventArgs args) 在 System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) 在 System.Net.WebClient....
  • @Vinny:听起来这与这个问题没有直接关系,而且在评论中很难阅读技术细节。提出一个包含所有相关细节的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多