Исключение CommunicationException произошло из-за того, что мой файл политики клиентского доступа не был доступен - PullRequest
0 голосов
/ 13 мая 2011

У меня есть служба 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.Вам может потребоваться связаться с владельцем сервиса, чтобы опубликовать файл междоменной политики и убедиться, что он позволяет отправлять HTTP-заголовки, связанные с SOAP.Эта ошибка также может быть вызвана использованием внутренних типов в прокси-сервере веб-службы без использования атрибута InternalsVisibleToAttribute.Смотрите подробности во внутреннем исключении.

Внутреннее исключение:
{System.Security.SecurityException ---> System.Security.SecurityException: ошибка безопасности.в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) в System.Net.Browser.BrowserHttpWebRequest. <> c_ DisplayClass5.b _4 (объект sendState) в System.Netynserser.> c_ DisplayClass4.b _1 (Object sendState) --- конец трассировки стека внутренних исключений --- в System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, состояние объекта) в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult asyncResult) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.Complete 101et * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * (1016).Я не уверен, почему это не так.

<?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 Ответ

1 голос
/ 14 мая 2011

Когда я обращаюсь к нему с помощью сокета , политика доступа клиента выбирается правильно, но когда я пытаюсь вызвать метод 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 для автономных служб.

...