2008-09-23 4 views
4

Я вызываю локально размещенную службу wcf из silverlight, и я получаю исключение ниже.Вызов службы 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 (Object 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 результат) }

Любые идеи о том, как прогрессировать?

ответ

0

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

0

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

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

2

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

Вот несколько советов, которые IV обнаружили, что должны быть проверены:

Добавление 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

0

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

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

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

Любые предложения?

0

Я нашел книгу, подробно описанную Джоном Папой, Data-Driven Services with Silverlight 2. У меня были те же проблемы, и эта замечательная книга объясняет все это.

1

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

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

В двух словах, хотя, вы должны иметь crossdomain.xml и не имеют 'заголовки = "*"'

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

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

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

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

Удачи!

0

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

0

У меня была аналогичная проблема, и удаление ссылки на обслуживание и добавление ее обратно снова решило проблему для меня.