Исключение CommunicationException произошло из-за того, что мой файл политики клиентского доступа не был доступен

У меня есть служба WCF, которая размещена в консольном приложении.
Вот файл app.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="CrossDomainServiceBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationServiceBehavior"
        name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationService">
        <endpoint address="" binding="basicHttpBinding" contract="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.Interfaces.IIntegrationService">

        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/IntegrationService" />
          </baseAddresses>
        </host>
      </service>
      <service name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.CrossDomainService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract=
"CAVES.Framework.Network.IntegrationSuite.IntegrationServices.Interfaces.ICrossDomainService" behaviorConfiguration="CrossDomainServiceBehavior"/>
      </service>
    </services>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

Когда я обращаюсь к нему через сокет, клиентская политика доступа выбирается правильно, но когда я пытаюсь вызвать метод IntegrationService, это дает мне следующее исключение:

Произошла ошибка при попытке сделать запрос к URI "http://localhost:8731/IntegrationService". Это может быть связано с попыткой доступа к сервису междоменным способом без надлежащей междоменной политики или с политикой, которая не подходит для служб SOAP. Вам может потребоваться связаться с владельцем службы, чтобы опубликовать файл междоменной политики и убедиться, что он позволяет отправлять связанные с SOAP заголовки HTTP. Эта ошибка также может быть вызвана использованием внутренних типов в прокси-сервере веб-службы без использования атрибута InternalsVisibleToAttribute. Пожалуйста, смотрите внутреннее исключение для более подробной информации.

Внутреннее исключение:
{System.Security.SecurityException ---> System.Security.SecurityException: ошибка безопасности. в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) в System.Net.Browser.BrowserHttpWebRequest. <> c_ DisplayClass5.b _4 (объект sendState) в System.Net.Browser.AsyncHelb <>. (Объект sendState) --- Конец внутренней трассировки стека исключений --- в System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Состояние объекта) в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(результат IAsyncResult)}

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

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <socket-resource port="4502-4534" protocol="tcp" />
      </grant-to>
    </policy>
    <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>

1 ответ

Решение

Когда я обращаюсь к нему через сокет, клиентская политика доступа выбирается правильно, но когда я пытаюсь вызвать метод IntegrationService, это дает мне следующее исключение

Ваш файл междоменной политики разрешает только сокет-соединения от портов 4502 до 4534, но ваше приложение пытается получить доступ к порту 8731. Если приложение не установлено из браузера (с повышенными привилегиями), Silverlight может получить доступ только к этому диапазону портов, поэтому 8731 не сработает

Теперь ваш сервис использует BasicHttpBinding, поэтому я предполагаю, что вы используете HTTP для этого. В этом случае файл политики должен обслуживаться в том же домене, что и служба, и он должен находиться в корне домена (в вашем случае это будет http://localhost:8731/clientaccesspolicy.xml). Сообщение в блоге по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2008/03/07/enabling-cross-domain-calls-for-silverlight-apps-on-self-hosted-web-services.aspx есть больше информации о том, как включить междоменные вызовы для SL для сервисов, размещаемых самостоятельно.

Другие вопросы по тегам