对于课程,我们必须按照教程创建一个Silverlight网站,搜索DIGG以查找给定主题。 (以本教程为基础:http://weblogs.asp.net/scottgu/archive/2010/02/22/first-look-at-silverlight-2.aspx)
我们必须使用以下代码从DIGG获取信息。
private void buttonSearch_Click(object sender, RoutedEventArgs e)
{
string topic = textboxSearchTopic.Text;
WebClient digg = new WebClient();
digg.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(digg_DownloadStringCompleted);
digg.DownloadStringAsync(
new Uri("http://services.digg.com/1.0/story.getAll?count=10&topic="+topic));
}
void digg_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
DisplayStories(e.Result);
}
}
private void DisplayStories(string xmlContent)
{
XDocument document = XDocument.Parse(xmlContent);
var stories = from story in document.Descendants("story")
where story.Element("thumbnail")!=null
select new DiggStory
{
Id = (string)story.Attribute("id"),
Title = (string)story.Element("title"),
Description = (string)story.Element("description"),
ThumbNail = (string)story.Element("thumbnail").Attribute("src"),
HrefLink = (string)story.Attribute("link"),
NumDiggs = (int)story.Attribute("diggs")
};
gridStories.ItemsSource = stories;
}
当按下按钮时,我们得到错误:
An exception occurred during the operation, making the result invalid. Check InnerException for exception details.
at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
at System.Net.OpenReadCompletedEventArgs.get_Result()
at DiggSample.Views.Search.Digg_OpenReadCompleted(Object sender, OpenReadCompletedEventArgs e)
at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)
at System.Net.WebClient.OpenReadOperationCompleted(Object arg)
我已经知道Digg API已经过时,但我不认为这个错误与它有任何关系。 (我们甚至得到一个本地XML文件,我们可以使用它但它仍然不起作用)
我不知道造成这种情况的原因是什么,我们老师的帮助不大,所以我希望有人可以帮助我们。
谢谢, 托马斯
答案 0 :(得分:1)
对于此段代码:
if (e.Error != null)
{
DisplayStories(e.Result);
}
如果e.Error 不 null,则表示要显示故事。我想你想把条件改为说e.Error == null
,因为这意味着没有错误,并且使用结果是安全的。您可能希望在条件中放置一个断点来检查e.Error
的值,看看是否有异常。
编辑:
当您将条件更改为e.Error == null
且没有任何反应时,这是因为错误非空,因此您的DisplayStories(e.Result)
语句从未触发过。
有问题的例外是SecurityException
,因为Silverlight浏览器内应用程序不允许您调用外部网站,除非该网站具有Silverlight跨域策略文件。不幸的是,Digg的策略文件不再允许跨域访问,这意味着除非您使用完全信任的浏览器运行您的应用程序,否则您将无法进行此调用。有关详细信息,请参阅Network Security Access Restriction in Silverlight。
要在浏览器中以完全信任的方式运行您的应用,请在Visual Studio中右键单击您的项目并选择属性。在“Silverlight”选项卡上,选中“启用浏览器用尽”复选框。然后单击“超出浏览器设置”按钮。在对话框中,选中“在浏览器外部运行时需要提升信任”的复选框。在“调试”选项卡中,对于“开始操作”,选择“超出浏览器应用程序”并从下拉列表中选择您的项目。
以这种方式运行时,您不应再获得SecurityException。