Вызов службы WCF из Silverlight - PullRequest
       19

Вызов службы WCF из Silverlight

4 голосов
/ 23 сентября 2008

Я звоню в локальный wcf сервис из silverlight, и я получаю исключение ниже.

Iv создал 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>

Произошла ошибка при попытке сделать запрос к URI «http://localhost:8005/Service1.svc'. Это может быть связано с кросс-доменом ошибка конфигурации. Пожалуйста, посмотрите внутреннее исключение для более подробной информации. --->

{System.Security.SecurityException ---> System.Security.SecurityException: Ошибка безопасности. в MS.Internal.InternalWebRequest.Send () в System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation () в System.Net.BrowserHttpWebRequest.InternalBeginGetResponse (AsyncCallback обратный вызов, состояние объекта) в System.Net.AsyncHelper. <> C__DisplayClass4.b__3 (объект sendState) --- конец внутреннего трассировка стека исключений --- в System.Net.AsyncHelper.BeginOnUI (BeginMethod beginMethod, обратный вызов AsyncCallback, Состояние объекта) в System.Net.BrowserHttpWebRequest.BeginGetResponse (AsyncCallback обратный вызов, состояние объекта) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend (IAsyncResult результат) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend (IAsyncResult результат)}

Есть идеи о том, как прогрессировать?

Ответы [ 10 ]

7 голосов
/ 23 сентября 2008

есть некоторые методы отладки , перечисленные здесь .. еще один полезный пост ..

2 голосов
/ 23 сентября 2008

Я знаю, что сервис работает правильно, потому что я добавил его в качестве ссылки на базовый сайт, и он работал. Я попробую поиграть с Fiddler, хотя есть небольшая проблема, поскольку элемент управления xaml не встроен в веб-страницу, он использует встроенный рендерер тестовой страницы.

Вот несколько указателей, которые я нашел, которые нужно проверить:

Добавление clientaccesspolicy.xml как показанный мой вопрос.

Добавление файла crossdomain.xml к маршруту хоста:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Убедитесь, что привязка - это basicHttp, поскольку это единственная поддерживаемая Silverlight (в настоящее время)

Службе нужен этот атрибут:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Полезные чтения: http://weblogs.asp.net/tolgakoseoglu/archive/2008/03/18/silverlight-2-0-and-wcf.aspx

http://timheuer.com/blog/archive/2008/06/06/changes-to-accessing-services-in-silverlight-2-beta-2.aspx

http://silverlight.net/forums/t/19191.aspx

http://timheuer.com/blog/archive/2008/04/09/silverlight-cannot-access-web-service.aspx

1 голос
/ 01 марта 2009

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

http://wallism.wordpress.com/2009/03/01/silverlight-communication-exception/

В двух словах, вы должны иметь файл crossdomain.xml и не иметь 'headers = "*"'

Bad:
    <allow-access-from domain=""*"" headers="*" />

Good:
    <allow-access-from domain=""*"" />
    <allow-http-request-headers-from domain=""*"" headers=""*"" />

Вместо * для заголовков вы можете использовать "SOAPAction" (работа в любом случае)

Да, и когда вы все заработаете, вы можете сделать его более безопасным: -)

Удачи!

1 голос
/ 23 сентября 2008

Некоторые методы отладки, доступные через веб-трансляцию, в которой я пытался продемонстрировать некоторые методы, о которых я писал: https://www.livemeeting.com/cc/mseventsbmo/view?id=1032386656&role=attend&pw=F3D2F263

0 голосов
/ 22 февраля 2013

У меня была похожая проблема: удаление ссылки на службу и добавление ее снова решило эту проблему для меня.

0 голосов
/ 10 декабря 2009

Убедитесь, что конечные точки и привязка службы WCF определены правильно. Для вызова службы WCF из одного и того же приложения не требуется файл политики домена.

0 голосов
/ 06 января 2009

Я нашел книгу Джона Папы Службы, управляемые данными с Silverlight 2 , чтобы подробно об этом рассказать. У меня были те же проблемы, и эта превосходная книга объясняет все это.

0 голосов
/ 12 ноября 2008

У меня такая же проблема. Я вижу, что клиентское приложение silverlight успешно выбирает clientaccesspolicy.xml. Я гарантировал, что clientaccesspolicy.xml не искажен, запросив его напрямую через firefox. Политика широко открыта, как и выше.

Теперь вот странный поворот. Если я удаляю clientaccesspolicy.xml и вместо этого добавляю файл политики crossdomain.xml в стиле Flash, он работает. В ходе проверки сети я вижу, как сначала сначала безуспешно запрашивается clientaccesspolicy.xml, а затем silverlight возвращается к crossdomain.xml.

Так что у меня есть обходной путь, но я предпочитаю, чтобы clientaccesspolicy.xml работал так, чтобы не было дополнительных ненужных сетевых обращений.

Есть предложения?

0 голосов
/ 23 сентября 2008

Если вы используете службу WCF в том же месте, где было предоставлено приложение Silverlight, вам не нужна междоменная политика. У меня были подобные ошибки при возврате данных LINQ to SQL от клиента, где была связь между несколькими объектами.

Сначала убедитесь, что служба WCF работает правильно. Сделайте это, создав простую функцию ping, которая просто повторяет ввод. Убедитесь, что вы можете позвонить в первую очередь. Если это работает, а ваша другая функция не имеет ничего, либо с параметрами, либо с возвратом функции. Если первая функция также не работает, используйте такой инструмент, как Fiddler, чтобы увидеть, какие данные отправляются по проводам. Использовать . в конце хоста, чтобы увидеть данные с локального хоста. Так что-то вроде http // localhost: 1234./default.aspx и используйте то же самое для адреса WCF.

0 голосов
/ 23 сентября 2008

Я бы начал с того, чтобы убедиться, что Silverlight действительно находит ваш файл политики клиентского доступа, проверяя сетевые вызовы с помощью Fiddler, FireBug или аналогичного инструмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...