Ошибка Silverlight 4 WCF «Междоменный»

#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. Да, это локальный путь на сервере. Я попробую, спасибо!