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