Служба останова Silverlight, исключение безопасности
Я пытаюсь заставить Silverlight работать с быстрым образцовым приложением и вызываю службу отдыха на другом компьютере. Сервер, на котором есть служба остального, имеет clientaccesspolicy.xml, который выглядит следующим образом:
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
И подбирается (по крайней мере, по сетевым трассам, которые я запускал), и нет запроса для crossdomain.xml. Код С# выглядит так:
public Page()
{
InitializeComponent();
string restUrl = "http://example.com/rest_service.html?action=test_result";
WebClient testService = new WebClient();
testService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(testService_DownloadStringCompleted);
testService.DownloadStringAsync(new Uri(restUrl, UriKind.Absolute));
}
void testService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
LoadTreeViewWithData(e.Result);
}
}
Однако я всегда получаю следующую ошибку безопасности:
{System.Security.SecurityException ---> System.Security.SecurityException: Security error.
at System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.BrowserHttpWebRequest.c__DisplayClass5.b__4(Object sendState)
at System.Net.AsyncHelper.c__DisplayClass2.b__0(Object sendState)
--- End of inner exception stack trace ---
at System.Net.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)}
Что я делаю неправильно? И почему ошибка безопасности не говорит мне более полезную информацию?
Ответы
Ответ 1
Если вы еще этого не сделали, я сначала попробую изменить restUrl на нечто более простое, как статическая страница HTML на том же сервере (или, если нужно, на вашем собственном сервере), чтобы проверить, работает ли ваш основной код.
Предполагая, что исключение безопасности специфично для этого URL-адреса REST (или сайта), вы можете взглянуть на ограничения доступа к URL в Silverlight 2 статья. В дополнение к более известным правилам перекрестных доменов существуют некоторые неочевидные правила безопасности, включающие типы файлов и "интернет-зоны".
Во-вторых, жалоба на многие сообщения об исключениях в Silverlight не очень полезна. В приведенной выше статье MSDN упоминается забавная заметка:
Когда пользователи получают сообщение об ошибке, из-за которой нарушается одна из этих политик доступа, ошибка может не указывать на точную причину.
Ответ 2
Я не смог выполнить перекрестный домен REST HTTP-удаления без добавления http-методов = "*" в элемент allow-from в clientaccesspolicy.xml. Когда я добавил атрибут http-методов, все сработало, и SecurityException остановилось.
Ответ 3
Загрузка HTML-страниц из "Надежного сайта" не удалась для моего локального приложения (http://localhost/) - пока я не добавил localhost в список доверенных сайтов.
Silverlight предотвращает вызовы "кросс-зоны" (в моем случае "Локальная сеть против доверенных сайтов" ) и "перекрестная схема" (например, http против https).
Пока он работает только с файлом crossdomain.xml. Сначала я попробовал "clientaccesspolicy.xml", но не понял.