WebClient.DownloadStringAsync вызывает исключение безопасности в Silverlight

Впервые использую Silverlight! После онлайн-урока. Я создаю приложение, которое позволяет пользователю искать истории с веб-сайта 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, состояние объекта)

в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

в System.Net.WebClient.GetWebResponse(запрос WebRequest, результат IAsyncResult)

в System.Net.WebClient.DownloadBitsResponseCallback(результат IAsyncResult)

После некоторого интенсивного поиска в Google я заметил, что люди упоминают файл crossdomain.xml. Не совсем уверен, что это такое, но я добавил его в корневой каталог веб-сервера, на котором работает элемент управления Silverlight, и добавил следующий текст. не имеет никакого значения:

<?xml version="1.0" ?>
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>

В чем дело?

2 ответа

Файл crossdomain.xml должен быть размещен на сервере, с которого вы пытаетесь загрузить файл, а не на сервере, который обслуживает приложение Silverlight.

Если на сервере нет файла crossdomain.xml, среда выполнения Silverlight не позволяет приложению загружать данные с этого сервера. По умолчанию он может получить доступ только к серверу, с которого он был загружен (та же политика происхождения).

Digg.com не имеет файла междоменного доступа (это означает, что клиенты Silverlight и Flash не могут напрямую использовать API). Прямой доступ из Silverlight невозможен.

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

Silverlight ==> YourWebHost ==> Digg.com

Другой обходной путь - вместо этого использовать их JavaScript API, а затем использовать мост JavaScript для связи с JavaScript из Silverlight.

Silverlight ==> JavaScript ==> Digg.Com ==> JavaScript ==> 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

Другие вопросы по тегам