我正在尝试创建一个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
}
}
答案 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
的简单调用可以解决问题。