Неизвестная ошибка при использовании Digg API и обработчика URI (silverlight)

Для класса мы должны следовать руководству по созданию веб-сайта 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-файл, который можем использовать, но он все равно не работает)

Я понятия не имею, что является причиной этого, и наш учитель не оказывает особой помощи, поэтому я надеюсь, что кто-нибудь сможет нам помочь.

Спасибо, Томас


person Schoof    schedule 19.10.2011    source источник


Ответы (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 больше не разрешает междоменный доступ, а это означает, что вы не сможете выполнить этот вызов, если не запустите приложение с полным доверием вне браузера. См. Ограничение доступа к сетевой безопасности в Silverlight Больше подробностей.

Чтобы запустить приложение как приложение вне браузера с полным доверием, в Visual Studio щелкните проект правой кнопкой мыши и выберите свойства. На вкладке «Silverlight» установите флажок «Разрешить запуск из браузера». Затем нажмите кнопку с надписью «Вне настроек браузера». В диалоговом окне установите флажок «Требуется повышенное доверие при работе вне браузера». На вкладке «Отладка» для «Действие при запуске» выберите «Приложение вне браузера» и выберите свой проект в раскрывающемся списке.

При запуске таким образом вы больше не должны получать SecurityException.

person Matt Bridges    schedule 19.10.2011
comment
Если я изменю это на ==, это не даст мне никаких ошибок, и на самом деле ничего не произойдет. Я нажимаю кнопку, но больше ничего не происходит. Позже в этом руководстве мы будем использовать следующий код: pastebin.com/CYywS9Wx для использования локального XML. файл (digglifestyle.xml), используя этот код, я снова получаю ту же ошибку. Спасибо за ваш ответ! :) - person Schoof; 19.10.2011
comment
Спасибо большое, все работает! (В некоторой степени). Поскольку Digg API устарел и больше не работает, он больше не дает результатов, но я нашел одну рабочую страницу XML, и она работает! Большое спасибо - person Schoof; 19.10.2011
comment
Но разве нет способа обойти это? Я бы хотел развернуть это как веб-страницу, но если я не могу, то ... :( - person Schoof; 22.10.2011
comment
Нет никакого способа обойти это, кроме как сделать так, чтобы ваш сервер (тот, на котором размещено ваше приложение Silverlight) обернул службу digg и выступил в качестве прокси. Тогда ваше приложение silverlight сможет отправлять запросы на ваш сервер, а не на digg, и не будет никаких исключений безопасности. - person Matt Bridges; 22.10.2011