1

Я получаю очень бесполезный 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")); 

ответ

1

Вы должны шутить! Я нашел причину, почему это не работает в статье MSDN под названием Network Security Access Restrictions in Silverlight:

One additional restriction on using the sockets classes is that the destination port range that a network application is allowed to connect to must be within the range of 4502-4534."

После изменения моего номера порта 4505, была достигнуты коды сервера после выполнения запроса от Silverlight.

+1

Используемые порты 8080 - 8085 для моего приложения, и это работает, технически вы не используете System.Net.Sockets (который ограничен портами 4502-4534), скорее HTTP, я думаю, что проблема кроется в другом месте, вы должны это понять перед тем, как он появится снова, когда вы меньше всего этого ожидаете – Neil

+0

Я также смог использовать более широкий набор сокетов при использовании простого HTTP. Но я впервые попытался использовать 'pollingDuplexHttpBinding'. Я почти уверен, что изменение номера порта было единственной модификацией, которую я сделал до того, как все стало работать, поэтому, возможно, ограничение применимо к этой привязке. Использовали ли вы более высокие номера портов с дуплексным HTTP-связыванием раньше? – Jacob

+1

@Neil: Был ли файл XAP доставлен с того же http-сервера на порт 8080-8085 за шанс? Нет ограничений на порт, из которого происходит XAP, и любой другой HTTP-доступ от XAP к серверу на этом порту будет рассматриваться как доступ на одном сайте. – AnthonyWJones

0

попытаться создать конечную точку через код, точно s как вы это делаете сейчас. Но на стороне клиента создайте прокси-сервер так.

CustomBinding binding = new CustomBinding(
       new PollingDuplexBindingElement(), 
       new BinaryMessageEncodingBindingElement(), 
       new HttpTransportBindingElement()); 


private IDashboardService _svc = new DashboardServiceClient(binding, 
    new EndpointAddress("http://localhost:8732/DashboardService")); 
+0

Я попробовал это и получил тот же результат. – Jacob

Смежные вопросы