CommunicationException с Silverlight и сервисом WCF - PullRequest
1 голос
/ 10 октября 2010

У меня есть приложение Silverlight 4, размещенное в веб-роли ASP Azure. Веб-роль предоставляет службу WCF. (Все это в одном решении Visual Studio.)

Я успешно добавил ссылку на сервис и сгенерировал код клиента. Однако это вызывает ошибку:

ExpenseServiceClient service = new ExpenseServiceClient();
service.GetExpensesCompleted += new EventHandler<GetExpensesCompletedEventArgs>(service_GetExpensesCompleted);
service.GetExpensesAsync();

Обратный звонок:

    static void service_GetExpensesCompleted(object sender, GetExpensesCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.ToString());
            return;
        }

        // ...
    }

е. Ошибка следующая:

{System.ServiceModel.CommunicationException: Произошла ошибка при попытке сделать запрос к URI «http://localhost:88/ExpenseService.svc'. Это может быть связано с попытками получить доступ к услуге в междоменном режиме без надлежащей междоменной политики на месте, или политика, которая не подходит для SOAP-сервисов. Ты можешь нужно связаться с владельцем сервис для публикации междомена файл политики и обеспечить его позволяет Связанные с SOAP HTTP-заголовки для отправки. Эта ошибка также может быть вызвана использованием внутренние типы в веб-сервисе прокси без использования Атрибут InternalsVisibleToAttribute.

Пожалуйста, смотрите внутреннее исключение для более подробная информация.

---> System.Security.SecurityException --->
System.Security.SecurityException: Security error.
   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__DisplayClass2.<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 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseServiceClientChannel.EndGetExpenses(IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseCalc_SilverLight.ExpenseService.IExpenseService.EndGetExpenses(IAsyncResult result)
   at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.OnEndGetExpenses(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}   System.Exception {System.ServiceModel.CommunicationException}

Оба они работают на localhost. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Silverlight ожидает, что файл ClientAccessPolicy.XML будет присутствовать всякий раз, когда он делает вызовы, которые рассматриваются как «междоменные» (сформулированные таким образом, поскольку он довольно строг).Вы это настроили?Я не эксперт по SL, но эта ошибка обычно возникает, когда файл политики отсутствует.

Простой способ - создать файл в корне вашего сайта, поэтому http://localhost/clientaccesspolicy.xml

Aдовольно свободный файл «allow all» выглядит примерно так:

<?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>

Для более сложных сценариев (которые могут возникнуть в Azure в зависимости от вашей архитектуры) вы можете создать обработчик IIS для обслуживания ожидаемого XML,который позволяет динамически создавать политику на основе запроса.

Существует множество ресурсов для этого подхода, если вы решите пойти на это, но я бы рекомендовал сначала попробовать простую, чтобы убедиться, что этовыпуск.

0 голосов
/ 11 октября 2010

Я не знаю много о SilverLight, но я встречал упоминание о междоменных политиках, когда говорил о развертывании приложений SilverLight, использующих хранилище Azure. Мой Google foo слаб, но вы можете попробовать one из этих ссылок.

...