Silverlight PollingDuplex InnerChannel ineccepibili con multipleMessagesPerPoll (serverPollTimeout)

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

Domanda

Im esecuzione Silverlight versione client 4.0.50917.0 e la versione SDK 4.0.50826.1

Ho creato un semplice client Silverlight contro un pollingduplex WCF vincolante:

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

Il mio cliente Silverlight connect in questo modo:

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

ho ricevuto un'EventHandler per innerchannel ineccepibili:

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

...

void InnerChannel_Faulted(object sender, EventArgs e)
    {

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

Quando si utilizza il sopra l'evento Client.InnerChannelFaulted succede esattamente dopo una serverPollTimeout. (15 secondi di default, verificata con Fiddler)

Se posso passare il mio cliente per collegare in questo modo:

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

alias singolo messaggio per sondaggio violinista rivela che dopo ogni serverPollTimeout viene avviato un nuovo sondaggio e il canale è non di errore.

Tutte le idee che cosa c'è che non va qui?

EDIT:

Ho letto http: / /social.msdn.microsoft.com/Forums/en/wcf/thread/1e6aa407-4446-4d4a-8dac-5392250814b8 e http://forums.silverlight.net/forums/p/200659/468206.aspx#468206 e sono d'accordo che "singleMessagePerPoll" non è una soluzione accettabile. Come si può vedere le mie versioni Sono in esecuzione le versioni più recenti di SDK e sviluppatore di esecuzione.

EDIT2:

Ho appena scoperto, che se io uso Google Chrome come il browser, invece di IE8 MultipleMessagesPerPoll funziona bene! Per me questo puzza di un bug di runtime vs IE8?

Edit3:

Un confermata sul blog silverlight WS: http://blogs.msdn.com/b/silverlightws/archive/2010/12/15/pollingduplex-using-multiplemessagesperpoll-issue-in-latest-sl4-gdrs.aspx

È stato utile?

Soluzione

Confermo la questione su un campione, con le stesse versioni SDK e client.

La questione è dotato di ulteriori implicazioni su altri browser troppo: Ho l'impressione che MultipleMessagePerPoll non sembra funzionare correttamente su di loro né (Fiddler e Firebug mostrano qualcosa che assomiglia molto a SingleMessagePerPoll)

Tuttavia ho potuto farlo funzionare utilizzando il client stack di rete (bypassando lo stack di rete del browser). Questa soluzione è tuttavia lungi dall'essere perfetto, come biscotti devono essere impostate manualmente in questo caso. Può può essere fastidioso o un non-problema a seconda dell'applicazione in uso.

Per eseguire tutte le richieste HTTP attraverso lo stack client, utilizzare questo prima di iniziare le chiamate di servizio:

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

Si potrebbe tuttavia essere un po 'più specifico, in base alle proprie esigenze.

Se qualcuno ha una risposta più soddisfacente, io sarà felice di leggerlo. Se siete interessati nel riprodurre il probleme, ho modificato un vecchio campione di Tomek utilizzare MultipleMessagePerPoll su SL4 invece di SingleMessagePerPoll su SL3.

Altri suggerimenti

Questo problema può essere causato da aggiungendo global.asax al sito web hosting. L'aggiunta di sessioni per il sito che ospita apparentemente viti il ??servizio di polling duplex WCF. Ho lottato con questo problema per diversi giorni e semplicemente eliminare il file Global.asax dal sito Web Host il blocco del servizio è andato via. Il multiplemessagesperpoll era una falsa pista. Funziona bene.

Vedere questo per più:

Come può un file Global.asax appena aggiunto fare un pasticcio del mio servizio WCF

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top