Получение NotFound CommunicationException в клиенте WCF Silverlight 3
Я получаю очень бесполезное сообщение CommunicationException при попытке вызвать службу WCF из Silverlight 3. Сообщение об исключении: "Удаленный сервер возвратил ошибку: NotFound". Каждое внутреннее исключение повторяет это сообщение. Есть ли проблема с моей настройкой, которая может быть причиной этой проблемы?
Вот мои настройки. Служба WCF размещается в службе Windows, работающей на платформе.NET 4.0. Он имеет три конечные точки:
- Основная конечная точка использует привязку pollingDuplexHttpBinding и имеет адрес "DashboardService"
- Конечная точка обмена метаданными использует привязку mexHttpBinding и имеет адрес "mex"
- Конечная точка, обеспечивающая политику (для этого необходимо разрешить междоменные вызовы), использует привязку webHttpBinding и имеет адрес "".
Вот весь раздел system.serviceModel:
<system.serviceModel>
<extensions>
<bindingExtensions>
<add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="PolicyProviderBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="RoboTrader.TheFloor.DashboardService">
<endpoint address="" binding="webHttpBinding"
behaviorConfiguration="PolicyProviderBehavior"
contract="RoboTrader.DashboardService.IPolicyProvider"/>
<endpoint address="DashboardService" binding="pollingDuplexHttpBinding"
contract="RoboTrader.DashboardService.IDashboardService"/>
<endpoint address="DashboardService/mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
В коде клиента Silverlight я добавил ссылку на сервис, и это, похоже, сработало очень хорошо. И клиент извлекает междоменную политику для службы, как и ожидалось. Однако, когда я вызываю основные методы DashboardService, я получаю CommunicationException, и точка останова в моем методе на стороне сервера никогда не достигается. Вот файл Silverlight ClientConfig, созданный путем добавления ссылки на службу:
<system.serviceModel>
<bindings>
<customBinding>
<binding name="PollingDuplexHttpBinding_IDashboardService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:8732/DashboardService"
binding="customBinding"
bindingConfiguration="PollingDuplexHttpBinding_IDashboardService"
contract="Service.IDashboardService"
name="PollingDuplexHttpBinding_IDashboardService" />
</client>
</system.serviceModel>
Есть ли какие-либо проблемы с этой настройкой, или есть какие-то дополнительные вещи, которые мне нужно сделать, чтобы заставить работать дуплексную HTTP-привязку опроса? Или вы хотя бы знаете, как я могу получить больше информации о проблеме?
Редактировать:
Я просто попытался настроить привязки клиента и сервера через код, чтобы посмотреть, поможет ли это, но я все еще получаю идентичное исключение. Вот код сервера:
var dboardService = new DashboardService();
ServiceHost host = new ServiceHost(dboardService);
host.AddServiceEndpoint(
typeof(IDashboardService),
new CustomBinding(
new PollingDuplexBindingElement(),
new BinaryMessageEncodingBindingElement(),
new HttpTransportBindingElement()),
"DashboardService");
host.Open();
А вот код клиента:
private IDashboardService _svc = new DashboardServiceClient(
new PollingDuplexHttpBinding(),
new EndpointAddress("http://localhost:8732/DashboardService"));
Изменить 2:
Я попытался изменить код клиента на это, но возникает та же проблема:
private IDashboardService _svc = new DashboardServiceClient(
new CustomBinding(
new PollingDuplexBindingElement(),
new BinaryMessageEncodingBindingElement(),
new HttpTransportBindingElement()),
new EndpointAddress("http://localhost:8732/DashboardService"));
2 ответа
Ты, должно быть, шутишь! Я нашел причину, по которой это не сработало в статье MSDN под названием " Ограничения доступа к сетевой безопасности в Silverlight":
Еще одно ограничение на использование классов сокетов заключается в том, что диапазон портов назначения, к которому разрешено подключаться сетевому приложению, должен находиться в диапазоне 4502-4534 ".
После изменения номера моего порта на 4505 код сервера был получен после выполнения запроса от Silverlight.
Попробуйте создать конечную точку с помощью кода, точно так же, как вы делаете это сейчас. Но на стороне клиента создайте прокси-сервер примерно так.
CustomBinding binding = new CustomBinding(
new PollingDuplexBindingElement(),
new BinaryMessageEncodingBindingElement(),
new HttpTransportBindingElement());
private IDashboardService _svc = new DashboardServiceClient(binding,
new EndpointAddress("http://localhost:8732/DashboardService"));