使用Digg API和URI处理程序(silverlight)出现未知错误

时间:2011-10-19 06:58:48

标签: xml silverlight api uri digg

对于课程,我们必须按照教程创建一个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文件,我们可以使用它但它仍然不起作用)

我不知道造成这种情况的原因是什么,我们老师的帮助不大,所以我希望有人可以帮助我们。

谢谢, 托马斯

1 个答案:

答案 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。