Pergunta

Estou recebendo uma Comunicação muito inútil ao tentar chamar um serviço WCF da Silverlight 3. A mensagem da exceção é "o servidor remoto retornou um erro: Notfound". Cada exceção interna dos papagaios da mesma mensagem. Existe um problema com a minha configuração que pode estar causando esse problema?

Aqui está minha configuração. O serviço WCF está hospedado em um serviço Windows em execução na plataforma .NET 4.0. Tem três pontos de extremidade:

  • O terminal principal usa uma ligação PollingDuplexhttpBinding e possui o endereço "DoupbardService"
  • O ponto final da troca de metadados usa uma ligação mexhttpbinding e tem o endereço "mex"
  • A política que fornece termina terminal (isso precisa permitir chamadas de domínio cruzado) usa uma encadernação WebHttpBinding e possui o endereço "".

Aqui está todo o sistema.Servicemodel Seção:

<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>

No código do cliente Silverlight, adicionei uma referência de serviço e isso parece ter funcionado muito bem. E o cliente busca a política de domínio cruzado no serviço conforme o esperado. No entanto, quando chamo os principais métodos do painel de service, recebo a CommunicationException e um ponto de interrupção no meu método do lado do servidor nunca é atingido. Aqui está o arquivo Silverlight ClientConfig gerado adicionando a referência de serviço:

<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>

Existem problemas com essa configuração ou há alguma coisa adicional que eu preciso fazer para obter uma ligação de HTTP duplex de votação ao trabalho? Ou você sabe pelo menos como posso obter mais informações sobre qual é o problema?

Editar:

Eu apenas tentei configurar as ligações do cliente e do servidor através do código para ver se isso ajudaria, mas ainda tenho a exceção idêntica. Aqui está o código do servidor:

var dboardService = new DashboardService();
ServiceHost host = new ServiceHost(dboardService);
host.AddServiceEndpoint(
    typeof(IDashboardService),
    new CustomBinding(
        new PollingDuplexBindingElement(),
        new BinaryMessageEncodingBindingElement(),
        new HttpTransportBindingElement()),
    "DashboardService");
host.Open();

E aqui está o código do cliente:

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

Editar 2:

Tentei alterar o código do cliente para isso, mas o mesmo problema ocorre:

private IDashboardService _svc = new DashboardServiceClient(
    new CustomBinding(
        new PollingDuplexBindingElement(),
        new BinaryMessageEncodingBindingElement(),
        new HttpTransportBindingElement()),
    new EndpointAddress("http://localhost:8732/DashboardService"));
Foi útil?

Solução

Você deve estar brincando comigo! Eu achei o motivo pelo qual isso não estava funcionando em um artigo do MSDN intitulado Restrições de acesso à segurança da rede em Silverlight:

Uma restrição adicional ao usar as classes de soquetes é que o intervalo de portas de destino que um aplicativo de rede pode se conectar deve estar dentro da faixa de 4502-4534 ".

Depois de alterar meu número de porta para 4505, o código do servidor foi atingido após fazer uma solicitação da Silverlight.

Outras dicas

Tente criar o endpoint através do código, exatamente da mesma maneira que você está fazendo agora. Mas, no lado do cliente, crie o proxy assim.

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


private IDashboardService _svc = new DashboardServiceClient(binding,
   new EndpointAddress("http://localhost:8732/DashboardService"));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top