Silverlight PollingDuplex InnerChannel criticado con multipleMessagesPerPoll (serverPollTimeout)

StackOverflow https://stackoverflow.com/questions/4184469

Pregunta

Im que funciona Silverlight 4.0.50917.0 versión del cliente y la versión del SDK 4.0.50826.1

He creado un simple cliente de Silverlight contra un pollingduplex WCF unión:

Web.config:

<system.serviceModel>
<extensions>
  <bindingExtensions>
    <add name="pollingDuplexHttpBinding"
        type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </bindingExtensions>
</extensions>
<behaviors>
  <serviceBehaviors>
    <behavior name="sv">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceThrottling maxConcurrentSessions="2147483647"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <!-- Create the polling duplex binding. -->
  <pollingDuplexHttpBinding>
    <binding name="multipleMessagesPerPollPollingDuplexHttpBinding"
             duplexMode="MultipleMessagesPerPoll"
             maxOutputDelay="00:00:01"/>

    <binding name="singleMessagePerPollPollingDuplexHttpBinding"
             maxOutputDelay="00:00:01"/>
  </pollingDuplexHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="sv" name="Backend.GUIPollingService">
    <endpoint address="" binding="pollingDuplexHttpBinding" bindingConfiguration="singleMessagePerPollPollingDuplexHttpBinding"
      contract="Backend.IGUIPollingService" />
    <endpoint address="mmpp" binding="pollingDuplexHttpBinding" bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
      name="multimessage" contract="Backend.IGUIPollingService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

Mi cliente Silverlight conexión de esta manera:

 string endPointAddress2 = "http://"
          + App.Current.Host.Source.DnsSafeHost
          + ":"
          + App.Current.Host.Source.Port.ToString(CultureInfo.InvariantCulture)
          + "/GUIPollingService.svc/mmpp";
 this.client = new GUIClientProxy.GUIPollingServiceClient(
        new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll), 
        new EndpointAddress(endPointAddress2))

Tengo un manejador de sucesos para innerchannel criticado:

client.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);

...

void InnerChannel_Faulted(object sender, EventArgs e)
    {

        Dispatcher.BeginInvoke(() =>
        { status.Text += "Inner channel Faulted\n\n"
        }
    } 

Cuando se utiliza el anterior caso Client.InnerChannelFaulted pasa exactamente después de un serverPollTimeout. (15 segundos por defecto, verificado con Fiddler)

Si cambio mi cliente para conectar de esta manera:

string endPointAddress2 = "http://"
          + App.Current.Host.Source.DnsSafeHost
          + ":"
          + App.Current.Host.Source.Port.ToString(CultureInfo.InvariantCulture)
          + "/GUIPollingService.svc";
 this.client = new GUIClientProxy.GUIPollingServiceClient(
        new PollingDuplexHttpBinding(), 
        new EndpointAddress(endPointAddress2))

Mensaje de alias solo por el violinista sondeo revela que después de cada serverPollTimeout se inicia un nuevo sondeo y el canal es no con fallo.

Alguna idea de lo que está mal aquí?

EDIT:

He leído http: / /social.msdn.microsoft.com/Forums/en/wcf/thread/1e6aa407-4446-4d4a-8dac-5392250814b8 y http://forums.silverlight.net/forums/p/200659/468206.aspx#468206 y estoy de acuerdo que "singleMessagePerPoll" no es una solución decente. Como se puede ver en mis versiones Estoy corriendo las versiones más recientes del SDK y desarrollador de tiempo de ejecución.

Edit2:

Me acabo de enterar, que si yo uso Google Chrome como navegador en lugar de IE8 MultipleMessagesPerPoll funciona bien! Para mí esto huele a un error de tiempo de ejecución frente a IE8?

Edit3:

Un confirmó en el blog Silverlight WS: http://blogs.msdn.com/b/silverlightws/archive/2010/12/15/pollingduplex-using-multiplemessagesperpoll-issue-in-latest-sl4-gdrs.aspx

¿Fue útil?

Solución

confirmo el tema en una muestra, con los mismos SDK y de cliente versiones.

La cuestión tiene algunas implicaciones más sobre otros navegadores también: Tengo la impresión de que MultipleMessagePerPoll no parece funcionar correctamente en ellos ni (violinista y Firebug mostrar algo que se parece mucho a SingleMessagePerPoll)

Sin embargo, me podría hacer que funcione mediante el cliente de pila de red (sin pasar por la pila de red del navegador). Esta solución es sin embargo lejos de ser perfecto, como las galletas se deben ajustar manualmente en este caso. Puede puede ser molesto o no sea un problema dependiendo de su aplicación.

Para llevar a cabo todas las solicitudes HTTP a través de la pila de cliente, utilice esto antes de empezar sus llamadas de servicio:

HttpWebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

Sin embargo, podría ser un poco más específico, de acuerdo a sus necesidades.

Si alguien tiene una respuesta más satisfactoria, yo estaría encantado de leerlo. Si está interesado en reproducir el probleme, he modificado una vieja muestra de Tomek utilizar MultipleMessagePerPoll en SL4 en lugar de SingleMessagePerPoll en SL3.

Otros consejos

Este problema puede ser causado por la adición de global.asax al sitio de alojamiento web. Adición de sesiones para el sitio de alojamiento de tornillos al parecer hasta el servicio de votación dúplex de WCF. Luché con este tema durante varios días y simplemente eliminar el archivo Global.asax desde el sitio Web de alojamiento la caída en el servicio fue. El multiplemessagesperpoll era una pista falsa. Trabaja muy bien.

Ver esto por más:

¿Cómo puede un archivo global.asax recién añadida hacer un lío de mi servicio WCF

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top