Domanda

sto diventando un CommunicationException molto inutile quando si tenta di chiamare un servizio WCF da Silverlight 3. Il messaggio di eccezione è "il server remoto ha restituito un errore: NotFound." Ogni eccezione interna pappagalli lo stesso messaggio. C'è un problema con la mia messa a punto che potrebbe causare questo problema?

Ecco il mio setup. Il servizio WCF è ospitato in un servizio di Windows in esecuzione su piattaforma .NET 4.0. Ha tre punti finali:

  • L'endpoint principale utilizza un pollingDuplexHttpBinding vincolante e ha l'indirizzo "DashboardService"
  • L'endpoint scambio dei metadati utilizza un mexHttpBinding vincolante e ha l'indirizzo "mex"
  • L'endpoint policy fornendo (questo deve consentire le chiamate cross-domain) utilizza un webHttpBinding vincolante e ha l'indirizzo "".

Ecco l'intera sezione 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>

Nel codice client di Silverlight, ho aggiunto un riferimento al servizio, e che sembra aver funzionato bene. E il cliente recupera la politica dei domini sul servizio come previsto. Tuttavia, quando chiamo i principali metodi DashboardService, ho l'CommunicationException, e un punto di interruzione nel mio metodo lato server non viene mai raggiunto. Ecco il file di Silverlight ClientConfig generato aggiungendo il riferimento al servizio:

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

Ci sono problemi con questa configurazione, o ci sono delle cose aggiuntive che devo fare per ottenere un legame di lavorare HTTP polling duplex? O ti almeno a conoscenza di come posso ottenere ulteriori informazioni su qual è il problema?

Modifica

Ho appena provato ad installare le associazioni client e server attraverso il codice, invece, per vedere se sarebbe d'aiuto, ma ho ancora ottenere l'eccezione identici. Ecco il codice del server:

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

Ed ecco il codice del client:

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

Modifica 2:

Ho provato a cambiare il codice del client per questo, ma lo stesso problema si verifica:

private IDashboardService _svc = new DashboardServiceClient(
    new CustomBinding(
        new PollingDuplexBindingElement(),
        new BinaryMessageEncodingBindingElement(),
        new HttpTransportBindingElement()),
    new EndpointAddress("http://localhost:8732/DashboardService"));
È stato utile?

Soluzione

Hai devi essere scherzando! Ho trovato la ragione per cui questo non funzionava in un articolo di MSDN intitolato Restrizioni Sicurezza di rete di accesso in Silverlight :

  

Una restrizione supplementare utilizzando le classi socket è che la gamma porta di destinazione che un'applicazione di rete è consentito connettersi deve essere compreso nell'intervallo di 4502-4534. "

Dopo aver cambiato il mio numero di porta 4505, il codice del server è stato raggiunto dopo aver fatto una richiesta da parte di Silverlight.

Altri suggerimenti

provare a creare l'endpoint tramite il codice, esattamente nello stesso modo in cui si sta facendo ora. Ma sul lato client creare il proxy in questo modo.

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


private IDashboardService _svc = new DashboardServiceClient(binding,
   new EndpointAddress("http://localhost:8732/DashboardService"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top