Question

Je reçois un CommunicationException très inutile lorsque l'on tente d'appeler un service WCF de Silverlight 3. Le message de l'exception est « Le serveur distant a renvoyé une erreur: NotFound. » Chaque exception interne perroquets ce même message. Y at-il un problème avec ma configuration qui pourrait être la cause de ce problème?

Voici ma configuration. Le service WCF est hébergé dans un service Windows fonctionnant sur la plate-forme .NET 4.0. Il a trois points d'extrémité:

  • Le principal critère d'évaluation utilise une liaison de pollingDuplexHttpBinding et a l'adresse "DashboardService"
  • Le point final d'échange de métadonnées utilise une liaison de mexHttpBinding et a l'adresse « mex »
  • Le critère d'évaluation fournissant des politiques (ce qui doit autoriser les appels inter-domaines) utilise une liaison de webHttpBinding et a l'adresse « ».

Voici toute la section de 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>

Dans le code client Silverlight, j'ai ajouté une référence de service, et qui semble avoir travaillé très bien. Et le client va chercher la politique inter-domaines sur le service comme prévu. Cependant, quand je l'appelle les principales méthodes de DashboardService, je reçois le CommunicationException, et un point d'arrêt dans ma méthode côté serveur est jamais atteint. Voici le fichier ClientConfig Silverlight généré en ajoutant la référence de service:

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

Y a-t-il des problèmes avec cette configuration, ou y at-il des choses supplémentaires que je dois faire pour obtenir un HTTP duplex de vote de liaison au travail? Ou avez-vous au moins savoir comment je peux obtenir plus d'informations sur ce que la question est?

Modifier

Je viens d'essayer la mise en place des liaisons client et serveur par le biais de code au lieu de voir si cela peut aider, mais je reçois toujours l'exception identique. Voici le code du serveur:

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

Et voici le code client:

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

Edit 2:

J'ai essayé de changer le code client à ce sujet, mais le même problème se produit:

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

La solution

Il faut que tu me faire marcher! J'ai trouvé la raison pour laquelle cela ne fonctionnait pas dans un article MSDN intitulé

Après avoir changé mon numéro de port à 4505, le code du serveur a été atteint après avoir fait une demande de Silverlight.

Autres conseils

essayez de créer le point final par le code, exactement de la même façon que vous le faites maintenant. Mais du côté client de créer le proxy comme ainsi.

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


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