Я получаю очень бесполезный CommunicationException при попытке вызова службы WCF из Silverlight 3. сообщение исключения является «Удаленный сервер возвратил ошибку: NotFound.» Каждое внутреннее исключение попугает это же сообщение. Есть ли проблема с моей настройкой, которая может вызвать эту проблему?Прием NotFound CommunicationException в Silverlight 3 WCF клиента
Вот мои настройки. Служба 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 привязки к работе? Или вы хотя бы знаете, как я могу получить больше информации о том, что проблема?
Edit:
Я просто попытался создать привязки клиента и сервера через код вместо того, чтобы увидеть, если это поможет, но я все еще получаю идентичное исключение. Вот код сервера:
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"));
Edit 2:
Я попытался изменить код клиента к этому, но та же проблема возникает:
private IDashboardService _svc = new DashboardServiceClient(
new CustomBinding(
new PollingDuplexBindingElement(),
new BinaryMessageEncodingBindingElement(),
new HttpTransportBindingElement()),
new EndpointAddress("http://localhost:8732/DashboardService"));
Используемые порты 8080 - 8085 для моего приложения, и это работает, технически вы не используете System.Net.Sockets (который ограничен портами 4502-4534), скорее HTTP, я думаю, что проблема кроется в другом месте, вы должны это понять перед тем, как он появится снова, когда вы меньше всего этого ожидаете – Neil
Я также смог использовать более широкий набор сокетов при использовании простого HTTP. Но я впервые попытался использовать 'pollingDuplexHttpBinding'. Я почти уверен, что изменение номера порта было единственной модификацией, которую я сделал до того, как все стало работать, поэтому, возможно, ограничение применимо к этой привязке. Использовали ли вы более высокие номера портов с дуплексным HTTP-связыванием раньше? – Jacob
@Neil: Был ли файл XAP доставлен с того же http-сервера на порт 8080-8085 за шанс? Нет ограничений на порт, из которого происходит XAP, и любой другой HTTP-доступ от XAP к серверу на этом порту будет рассматриваться как доступ на одном сайте. – AnthonyWJones