WebClient.DownloadStringAsync вызывает исключение безопасности в Silverlight - PullRequest
2 голосов
/ 24 ноября 2010

Впервые использую 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 * 101syncResult*

в 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 ]

2 голосов
/ 24 ноября 2010

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

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

0 голосов
/ 28 ноября 2010

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

...