Pregunta

Me estoy poniendo un CommunicationException muy poco útil cuando se trata de llamar a un servicio WCF de Silverlight 3. El mensaje de la excepción es "El servidor remoto devolvió un error: NotFound." Cada loros excepción interna que mismo mensaje. ¿Hay un problema con mi configuración que podría ser la causa de este problema?

Aquí está mi configuración. El servicio WCF está alojado en un servicio en ejecución de Windows en la plataforma .NET 4.0. Cuenta con tres criterios de valoración:

  • El criterio de valoración principal utiliza una unión pollingDuplexHttpBinding y tiene la dirección "DashboardService"
  • El criterio de valoración de intercambio de metadatos utiliza una unión mexHttpBinding y tiene la dirección "mex"
  • El criterio de valoración política de proporcionar (esto debe permitir llamadas entre dominios) utiliza una unión webHttpBinding y tiene la dirección "".

Aquí está toda la sección 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>

En el código de cliente de Silverlight, he añadido una referencia de servicio, y que parece haber funcionado muy bien. Y el cliente obtiene la política entre dominios en el servicio como se esperaba. Sin embargo, cuando llamo a los principales métodos DashboardService, consigo el CommunicationException, y nunca se llega a un punto de interrupción en mi método del lado del servidor. Aquí está el archivo Silverlight ClientConfig generada mediante la adición de la referencia de servicio:

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

¿Hay algún problema con esta configuración, o hay alguna cosas adicionales que tengo que hacer para conseguir un sondeo dúplex enlace HTTP al trabajo? O bien, hacer por lo menos conocimientos de cómo puedo obtener más información sobre cuál es el problema?

Editar

Me acaba de intentar establecer los enlaces de cliente y servidor a través de código en lugar de ver si ayudaría, pero aún así obtener la excepción idéntica. Aquí está el código del 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();

Y aquí está el código de cliente:

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

Editar 2:

He intentado cambiar el código de cliente para esto, pero se produce el mismo problema:

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

Solución

Tienes que estar bromeando! He encontrado la razón por la que esto no estaba trabajando en un artículo titulado MSDN Restricciones Network Access Seguridad en Silverlight :

  

Una restricción adicional sobre el uso de las clases de enchufes es que el intervalo de puertos de destino que se permite que una aplicación de red para conectarse a debe estar dentro del intervalo de 4.502-4.534. "

Después de cambiar mi número de puerto a 4505, se alcanzó el código del servidor después de hacer una solicitud de Silverlight.

Otros consejos

intente crear el punto final a través de código, exactamente de la misma forma en que lo está haciendo ahora. Pero en el lado del cliente crear el proxy como tal.

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


private IDashboardService _svc = new DashboardServiceClient(binding,
   new EndpointAddress("http://localhost:8732/DashboardService"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top