Неизвестная ошибка при использовании Digg API и обработчика URI (silverlight) - PullRequest
0 голосов
/ 19 октября 2011

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

1 голос
/ 19 октября 2011

Для этого раздела кода:

if (e.Error != null)
{
    DisplayStories(e.Result);             
}

Вы хотите отобразить истории, если ошибка e.Error равна , а не null. Я думаю, что вы хотите изменить условие на e.Error == null, так как это означало бы, что ошибки не было, и результат можно безопасно использовать. Возможно, вы захотите поставить точку останова в условии, чтобы проверить значение e.Error, чтобы увидеть, есть ли у вас исключение.

Edit:

Когда вы изменили условие на e.Error == null и ничего не произошло, это потому, что ошибка была ненулевой, поэтому ваш оператор DisplayStories(e.Result) никогда не выполнялся.

Данное исключение, SecurityException, происходит из-за того, что браузерные приложения Silverlight не позволяют совершать звонки на внешние веб-сайты, если на этом веб-сайте отсутствует файл междоменной политики Silverlight. К сожалению, файл политики Digg больше не разрешает междоменный доступ, что означает, что вы не сможете сделать этот вызов, если не запустите свое приложение с полным доверием вне браузера. Подробнее см. Ограничение доступа к сетевой безопасности в Silverlight .

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

Когда вы запускаете этот путь, вы больше не должны получать SecurityException.

...