Исключение 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 для сервисов, размещаемых самостоятельно.