首次使用Silverlight!在线教程之后。我正在创建一个应用程序,允许用户使用WebClient从Digg网站搜索故事,并将它们显示在Silverlight控件的数据网格中。
以下是代码:
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
string topic = txtTopic.Text;
string diggUrl = String.Format("http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com", topic);
WebClient diggService = new WebClient();
diggService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(diggService_DownloadStringCompleted);
diggService.DownloadStringAsync(new Uri(diggUrl));
}
void diggService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
DisplayStories(e.Result);
}
}
每当我在diggService_DownloadStringCompleted
事件处理程序上放置一个断点并单击搜索按钮e.Error
时,总是等于没有消息的System.Security.SecurityException和带有消息的相同类型的内部异常'安全错误'。堆栈跟踪是:
在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,Object state)
在System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
在System.Net.WebClient.GetWebResponse(WebRequest请求,IAsyncResult结果)
at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)
经过一些沉重的谷歌搜索后,我看到人们提到了一个crossdomain.xml文件。不完全确定这是什么,但我在运行Silverlight控件的Web服务器的根目录中添加了一个,并添加了以下文本。没有任何区别:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
发生了什么事?
答案 0 :(得分:2)
需要将crossdomain.xml文件放在您尝试从中下载文件的服务器上,而不是放在为Silverlight应用程序提供服务的服务器上。
如果服务器没有crossdomain.xml文件,则Silverlight运行时不允许应用程序从该服务器下载数据。默认情况下,它只能访问从中下载的服务器(相同的原始策略)。
答案 1 :(得分:0)
Digg.com没有跨域文件(意味着Silverlight和Flash客户端无法直接使用API)。无法直接从Silverlight访问。
一种解决方法是在您的网络主机上制作代理。代理将从您的Web服务器调用Digg的API,而不是直接从Silverlight客户端调用。
Silverlight ==&gt; YourWebHost ==&gt; Digg.com
另一种解决方法是使用他们的JavaScript API,然后使用JavaScript桥从Silverlight与JavaScript通信。
Silverlight ==&gt; JavaScript ==&gt; Digg.Com ==&gt; JavaScript ==&gt; Silverlight的
对于JavaScript调用: http://developers.digg.com/response
Silverlight桥引用: http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx 演练: Silverlight到JavaScript: http://msdn.microsoft.com/en-us/library/cc221359(v=VS.95).aspx JavaScript到Silverlight: http://msdn.microsoft.com/en-us/library/cc221414(v=VS.95).aspx