Domanda

Guarda anche In che modo un server WCF informa un client WCF sulle modifiche?(Soluzione migliore quindi semplice polling, ad es.commento o sondaggio lungo)

Devo utilizzare la tecnologia push con WCF tramite firewall client.Questo deve essere un problema comune e so per certo che funziona in teoria (vedi collegamenti sotto), ma non sono riuscito a farlo funzionare e non sono riuscito a trovare un esempio di codice che lo dimostri.

Requisiti:

  • WCF
  • I client si connettono al server tramite la porta TCP 80 (netTcpBinding).
  • Il server restituisce le informazioni a intervalli irregolari (da 1 minuto a diverse ore).
  • Gli utenti non dovrebbero dover configurare i propri firewall, i push del server devono passare attraverso i firewall che hanno tutte le porte in entrata chiuse.A questo scopo è necessario il duplex TCP sulla stessa connessione, un dual-binding non funziona poiché sul firewall del client deve essere aperta una porta.
  • I client inviano heartbeat al server a intervalli regolari (forse ogni 15 minuti) in modo che il server sappia che il client è ancora vivo.
  • Il server è IIS7 con WAS.

La soluzione sembra essere il duplex netTcpBinding.Sulla base di queste informazioni:

WCF tramite firewall e NAT

Mantenere le connessioni aperte in IIS

Ma devo ancora trovare un esempio di codice che funzioni..Ho provato a combinare gli esempi "Duplex" e "TcpActivation" dagli esempi WCF di Microsoft senza fortuna.Per favore qualcuno può indicarmi un codice di esempio che funzioni o creare una piccola app di esempio.Molte grazie!

È stato utile?

Soluzione

Ho trovato un paio di soluzioni:

Ghiaccio ZeroC GPL con opzione commerciale.Ho testato solo rapidamente.Sembra più potente di .NET Remoting ed è sviluppato molto attivamente.

RemObjects Sviluppo commerciale e attivo, supporta tutto ma non sembra avere tutte le funzionalità più avanzate utilizzate da GenuineChannels.

Canali genuini.Utilizza la comunicazione remota con molte funzionalità aggiuntive interessanti, la più importante è che funziona tramite NAT senza la necessità di aprire il firewall del client.Purtroppo sembra essere molto morto.

Un'altra soluzione è utilizzare lo streaming con IIS, secondo questo articolo: Mantenere le connessioni aperte in IIS

Il client effettua la prima connessione (http con IIS6, tcp con IIS7) al server sulla porta 80, la connessione viene poi mantenuta aperta con una risposta in streaming che non termina mai.

Non ho avuto il tempo di sperimentarlo e non ho trovato un esempio che affermi che risolve specificamente il problema del firewall, ma ecco un eccellente esempio che probabilmente funziona: Streaming XML.

Altri suggerimenti

Hai provato a guardare: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

Puoi fornire esempi di ciò che hai già tentato?Con dettagli su firewall ecc., messaggi di errore?

Se è possibile affrontare direttamente sia il client che il server e i firewall non rappresentano un problema, hai considerato di consentire ai client di registrare un URL che fornisce un contratto supportato.Il server può quindi chiamare questo servizio ogni volta che è necessario, senza la necessità di stabilire una connessione di lunga durata (ma per lo più inattiva), evita la necessità di battere il cuore e può essere reso resiliente tra sessioni\connessioni.

Nella maggior parte delle configurazioni del firewall, la connessione TCP verrà interrotta dal firewall se è inattiva per risparmiare risorse.Il timeout di inattività probabilmente non è qualcosa che puoi controllare.Alcuni li demoliranno se sono inattivi e viene raggiunto un limite di risorse.

La maggior parte degli ambienti aziendali non consentirà comunque a nessuna macchina di stabilire una connessione TCP in uscita.

Inoltre, l'utilizzo di questo meccanismo significa che avrai problemi di ridimensionamento.Penso che la soluzione più affidabile sia mettere in coda le informazioni e chiedere ai tuoi clienti di interrogarle regolarmente.Se possibile, utilizzare la memorizzazione nella cache in modo che un successivo sondaggio del client ottenga i dati memorizzati nella cache del proxy del cliente, se ne sta utilizzando una.

Se devi inviare i dati in modo tempestivo, in una terra inferiore al secondo (ad es.servizi finanziari), prendi in considerazione alcune infrastrutture di messaggistica come un distributore NServiceBus sul lato client, ma ciò richiederà l'installazione da parte del cliente...

Allora, hai provato a usare Toredo?Avendo letto che apparirebbe lì, probabilmente è troppo complicato da configurare per un utente.

Non ho provato lo scenario di cui parli quindi non posso esserti di grande aiuto, mi spiace.Se tutto ciò che devi bypassare è il firewall del client, potresti voler controllare questo post.

Buona fortuna.

Hai provato questo?DuplexHttpBinding

Utilizza una tecnica di polling intelligente incapsulata come associazione WCF personalizzata.Quindi dovrebbe funzionare fuori dagli schemi.

È possibile eseguire la seguente modifica nel client per accedere al servizio Web duplex sul client abilitato al firewall.

  • Imposta l'opzione WebHttp selezionata in Firewall -> Avanzate -> Impostazioni (di Impostazioni connessione di rete) -> Server Web (Http)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top