2010-11-25 6 views
6

Recibo este error desconcertante al invocar una devolución de llamada unidireccional a un cliente de WPF desde un servicio de WCF.WCF: Problemas con las devoluciones de llamada unidireccionales

el mensaje no pudo ser transferidos dentro del tiempo de espera asignado de 00:01:00. No había espacio disponible en la ventana de transferencia confiable del canal . El tiempo asignado a esta operación puede haber sido una porción de un tiempo de espera más largo .

No está enviando demasiados datos, solo una lista de cadenas que solo tiene una única cadena corta dentro.

Mi servidor tiene la siguiente configuración:

<xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="RawDealService.GameService"> 
     <endpoint address ="" binding="wsDualHttpBinding" bindingConfiguration="basicConfig" contract="MyService.IGameService"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     </service> 
    </services> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="basicConfig" messageEncoding="Text"> 
      <security mode="None"/> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

Y mi cliente tiene la siguiente configuración:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsDualHttpBinding> 
       <binding name="WSDualHttpBinding_IGameService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
        <security mode="None"> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
        </security> 
       </binding> 
      </wsDualHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:44259/GameService.svc" binding="wsDualHttpBinding" 
       bindingConfiguration="WSDualHttpBinding_IGameService" contract="IGameService" 
       name="WSDualHttpBinding_IGameService"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 

    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

Su justo desconcertante que esto podría suceder, dado que el mensaje es relativamente pequeño y el la devolución de llamada es solo de una sola dirección. ¿Debería probar algunas vinculaciones diferentes?

+0

Puede publicar su clase de interfaz de servicio (también interfaz de devolución de llamada) – Rev

+0

@Rev Vea a continuación. Encontré el problema pero no puedo aceptar mi propia respuesta hasta mañana. ¡Gracias de cualquier manera! – Ben

+0

Su bienvenida :) – Rev

Respuesta

6

Encontré el problema, y ​​es desafortunado que este mensaje de error en particular me haya enviado por una ruta completamente incorrecta.

Mi configuración de DataContract tenía algunas clases con herencia en ella, y no había marcado correctamente para KnownType s.

Supongo que en algún momento el cliente intentó deserializar un objeto asociado y falló. El marco no debe haber manejado correctamente el error, y tal vez siguió intentando enviarlo una y otra vez, y no obtuvo respuesta después de un minuto.

Tal vez si tuviera una llamada de dos vías, habría obtenido un seguimiento de la pila más informativo.

+0

gracias! lo mismo aquí :( –

3

Huele como un problema de bloqueo/enhebrado en lugar de un problema de red.

¿Por casualidad está haciendo algún tipo de bloqueo/esperando que se reciba el mensaje de un solo sentido en el cliente? Si es así, y está utilizando el contexto de sincronización, está bloqueando WCF, bloqueando la cola de mensajes esperando el mensaje, mientras que el mensaje no se puede recibir hasta que la cola de mensajes se desbloquee.

Si este es el caso, deberá establecer UseSynchronizationContext=false en su cliente, o evitar el bloqueo mientras espera a que se reciba el mensaje.

Dicho esto, no tengo mucha experiencia con WsDualHttpBinding.

+0

Una buena idea. Me he topado con mi parte justa de problemas de enhebrado ya con este proyecto. Desafortunadamente, este problema no parece ser uno de ellos (ver mi respuesta a continuación). – Ben

Cuestiones relacionadas