#silverlight #wcf
#silverlight #wcf
Вопрос:
У нас есть служба WCF, запущенная на удаленном сервере. Он запускается как служба Windows, не размещенная в IIS. Мы можем получить доступ к этой службе WCF из наших приложений WinForms и WFP без каких-либо проблем. Однако, когда мы пытаемся подключиться к нему из приложения Silverlight 4, мы получаем следующую ошибку:
Произошла ошибка при попытке сделать запрос к URI ‘http://111.111.111.111/8484/Psn ‘. Это может быть связано с попыткой получить доступ к службе междоменным способом без надлежащей междоменной политики или политики, которая не подходит для служб SOAP. Возможно, вам потребуется связаться с владельцем службы, чтобы опубликовать файл междоменной политики и убедиться, что он разрешает отправку HTTP-заголовков, связанных с SOAP. Эта ошибка также может быть вызвана использованием внутренних типов в прокси веб-службы без использования атрибута InternalsVisibleToAttribute. Пожалуйста, смотрите внутреннее исключение для получения более подробной информации.
Не мог бы кто-нибудь перевести это на английский и объяснить, что я мог бы сделать, чтобы удовлетворить Silverlight?
Ответ №1:
Первое, что нужно проверить, это наличие clientaccesspolicy.xml
файла или crossdomain.xml
подшивки на хосте службы WCF. Любой из этих файлов может использоваться для управления тем, какие домены имеют доступ к вашей службе. Без них никто не имеет доступа из Silverlight. Эти файлы находятся в корневом каталоге хоста службы WCF:
Если, например, служба размещена в http://fabrikam.com тогда файл должен быть расположен по адресу http://fabrikam.com/clientaccesspolicy.xml … [или] … http://fabrikam.com/crossdomain.xml.
Следующий clientaccesspolicy.xml
файл разрешит доступ из http://www.example.com
, но заблокирует его отовсюду еще:
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="http://www.example.com"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Аналогичный crossdomain.xml
файл был бы:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="http://www.example.com" headers="SOAPAction,Content-Type"/>
</cross-domain-policy>
Комментарии:
1. Спасибо. Два вопроса. Куда именно я должен поместить этот файл? И что, если я не знаю (или мне все равно), по каким URL разрешить доступ? У нас будут клиенты со всей страны, которые будут пользоваться этой службой WCF. Мы не сможем узнать все URL-адреса.
2. @Hosea146 — вы помещаете файл в корневой каталог службы. Вы также можете использовать подстановочные знаки для домена, если хотите разрешить общедоступный доступ.
3. Наша служба WCF установлена в C:Program Файлы Windows PsnService. Так будет ли файл отправлен туда? Также, можете ли вы привести мне пример домена, использующего подстановочные знаки? Я не уверен в формате, который мне нужен.
4. @Hosea146 — предполагая, что вы указали мне локальный путь на сервере, тогда да, он идет туда. Что касается подстановочных знаков
<domain uri="*"/>
, то это позволило бы ввести всех.5. Да, это локальный путь на сервере. Я попробую, спасибо!