Вопрос

Я получаю очень бесполезное исключение CommunicationException при попытке вызвать службу WCF из Silverlight 3.Сообщение об исключении звучит так: "Удаленный сервер вернул ошибку:Не найдено ". Каждое внутреннее исключение повторяет одно и то же сообщение.Есть ли проблема с моей настройкой, которая может быть причиной этой проблемы?

Вот моя установка.Служба 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"));
Это было полезно?

Решение

Ты, должно быть, издеваешься надо мной!Я нашел причину, по которой это не работало, в статье 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"));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top