Silverlight HttpWebRequest SecurityException - PullRequest
4 голосов
/ 28 ноября 2011

Проблема

У меня есть спокойный веб-сервис, работающий на удаленном сервере. Я уже создал приложение WP7, которое использует его, поэтому я знаю, что оно работает. Я портирую приложение на веб-приложение Silverlight и столкнулся с проблемой.

Я включил упрощенную версию кода, а также выданную ошибку. Ошибка выдается по методу EndGetResponse.

Не стесняйтесь спрашивать дополнительную информацию. Я искал решения и не нашел ничего, что работает или действительно относится к моей проблеме. Кажется, что такой простой код, и он отлично работает на версии WP7. Любая помощь будет оценена.

Код

void SendRequest() {
    string url = "http://some-example-restful-service:5600/locations/data/all";
    HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);

    request.Method = "POST";
    request.ContentType = "application/json; charset=utf-8";

    request.BeginGetResponse(new AsyncCallback(RequestCallback), request);
}

public static void RequestCallback(IAsyncResult asyncResult) {
    HttpWebRequest request = (HttpWebRequest) asyncResult.AsyncState;
    HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(asyncResult);

    //Parse JSON object

    response.Close();

    //Dispatch result back to GUI thread
}

Ошибка

SecurityException не было обработано кодом пользователя

System.Security.SecurityException: ошибка безопасности.

at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)
--- End of inner exception stack trace ---
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at ServieTest.MainPage.RequestCallback(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassd.<InvokeGetResponseCallback>b__b(Object state2)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Ответы [ 2 ]

7 голосов
/ 30 ноября 2011

Оказывается, мне нужно было добавить файл clientaccesspolicy.xml в корень домена службы.

Ниже приводится содержание файла:

<?xml version="1.0" encoding="utf-8"?>
<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> 
1 голос
/ 28 ноября 2011

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

...