2012-06-18 10 views
5

Ho seguito questo tutorial (almeno in base mia WCF in questo, coz ho bisogno quindi di lavorare allo stesso modo): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspxCome utilizzare un doppio servizio WCF su Internet?

Si sta lavorando molto bene sul mio computer, ma ho bisogno di usarlo su internet. Durante il tentativo di farlo ho sentito (su Internet) che è meglio usare netTcpBiding.

Avrò un server che sarà a conoscenza del numero di clienti online. Volevo un servizio WFC sul mio IIS nel server e un servizio Windows che lo consumava e lo notificava. Ho bisogno che il callback coz il server debba essere in grado di eseguire alcuni comandi sul client.

Sarei molto contento se qualcuno potesse aiutarmi.

Grazie in anticipo,

Edit:

stato chiaro: io non riuscivo a farlo funzionare su internet. Ragazzi potete mostrarmi come posso cambiare le mie configurazioni (Web.config e App.config) per usare netTcpBinding e lavorare su internet?

Grazie ancora,

Modifica 2:

mio web.config nel mio WCFServiceApplication è:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" 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="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService"> 
     <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

mio app.config nel mio servizio di windows è:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" 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="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" 
     contract="PCWatcherWCFServiceReference.IPCWatcherWCFService" 
     name="WSDualHttpBinding_IPCWatcherWCFService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Basta cambiarlo in netTcpBinding non funziona ...

Ma sarei abbastanza contento di poterlo eseguire su Internet ... Ho pubblicato il WCFService su IIS. Link:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

O

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

Basta cambiare le configurazioni sua sufficienti per farlo funzionare attraverso internet? come ho detto, locale funziona bene.

ho pensato che solo cambiando l'indirizzo dell'endpoint sul client per una delle URL sopra di essa whould funziona, ma non ha ...

L'esempio che si è collegato ospita il servizio sulla WPF. Non so se si applica al mio cenario ...

i Credo che sto andando con il DualHttpBinding, non pensi che il port forwarding sia buono per le mie esigenze, posso avere un sacco dei clienti in una intranet e avendo il router decidere quale invierà informazioni perché non va bene? o c'è un modo per far sì che il router risponda corretamente a tutte le macchine che si collegano al mio webserver attraverso la stessa porta ?!(Solo chiedendo, hehehe)

Grazie mille in anticipo,

Modifica il 21/06/2012:

Grazie per la lettura. Non sono riuscito a far funzionare il servizio con netTcpBinding in LAN. Ho fatto un campione finto del mio cenario. È here. Chiamato DualCommunicationTest.

Quando ho iniziato questo post, volevo solo sapere come far funzionare questo cenarion su internet. Solo quello. Durante la mia ricerca di una soluzione prima di postare qui, ho letto che netTcpBinding è migliore. Così ho chiesto a questo proposito. Era solo una domanda a parte.

Quindi ... le mie attuali esigenze sul post sono:

Come usare the sample i developed su internet.

O

Come fare the sample i developed lavoro con netTcpBinding e quindi essere in grado di usarlo su internet. (Sono abbastanza sicuro che lo Clunky Coder mi abbia insegnato la seconda parte, su come pubblicare un net.tcp su Internet con IIS e cose del genere, grazie mille per questo, ma non ero ancora in grado di testarlo, perché non potevo t fare un netTcp ancora.)

Mi dispiace se non sono stato abbastanza chiaro, il mio inglese non è così buono. sry e grazie ancora, molto.

risposta

5

netTcpBinding è migliore per la comunicazione duplex (comunicazione con callback) ed è più performante di WSDualHttpBinding che è il binding preferito per la comunicazione duplex su HTTP. Ma non dovresti usare veramente lo netTcpBinding su internet sebbene tecnicamente sia possibile e potrebbe funzionare, ma le porte utilizzate da netTcpBinding potrebbero essere (e di solito sono) bloccate dai firewall su Internet. Quando invii qualcosa attraverso Internet, fa un sacco di hop e passa attraverso molti router e firewall, e non c'è alcuna garanzia che quei router e firewall abbiano tutte le porte aperte. Ma se è possibile aprire le porte (per netTcp è TCP 808) su entrambi gli endpoint client e server (di solito fatto dal port forwarding sul router) potrebbe funzionare, ma il consiglio generale è di non usare netTcpBinding su internet. Detto questo, l'ho usato un paio di volte per i miei servizi ei miei clienti sono stati in grado di utilizzare il servizio su Internet senza problemi, dopo aver inoltrato le porte sia al client che al server.

In generale per la comunicazione duplex su internet si ha la WSDualHttpBinding e se si dispone di un client di Silverlight (Silverlight non supporta WSDualHttpBinding) è possibile utilizzare PollingDuplexHttpBinding.

Si consiglia inoltre di leggere this.

EDIT:

per cambiare la situazione esempio per utilizzare netTcpBinding, basta cambiare le associazioni nel file di configurazione da utilizzare al posto di netTcpBindingwsDualHttpBinding. Dai un'occhiata allo this article, fa ciò che fa il link che hai postato, con netTcpBinding e altre spiegazioni.

EDIT 20/06/2012:

stato chiaro: io non riuscivo a farlo funzionare su internet. Potete mostrarmi come posso cambiare le mie configurazioni (Web.config e App.config) per usare netTcpBinding e lavorare su internet?

sembra che sono stati in grado di ottenere il servizio di lavorare con netTcpBinding in LAN, in modo che il problema in precedenza è stato corretto e si sta ora avendo problemi che ospita il servizio in IIS e la sua pubblicazione on-line. Quando il tuo servizio funziona in una LAN, funzionerà su Internet dopo averlo ospitato su IIS e inoltrato le porte appropriate sui router client e server, questo è uno scenario comune ed è ben documentato online. Per fare ciò È necessario ospitare il servizio come applicazione nel proprio sito Web IIS. Devi assicurarti che il tuo servizio abbia un file .svc che punti al percorso del servizio, quindi copia il contenuto di App.Config (file di configurazione del servizio) in un nuovo web.config (nella stessa directory fisica del tuo App.config) e rimuovere anche la sezione <host><baseAddresses> nel web.config appena creato, indirizzare il percorso fisico dell'applicazione al percorso di questo servizio sul computer host del servizio. Una volta che ci si è occupati di questo, sii sicuro di modificare i collegamenti del sito web predefinito per abilitare i collegamenti specifici utilizzati dal servizio, per netTcpBinding vai a: Sito web -> 'Modifica collegamenti ...' -> 'Aggiungi ...' quindi scegli net .tcp e assegnagli le porte. Quindi, passare all'applicazione "Impostazioni avanzate" e abilitare net.tcp, il servizio netTcpBinding in genere dispone di http,net.tcp come protocolli abilitati. Se si verificano errori di dentizione, accertarsi che il pool di applicazioni predefinito (o il pool di applicazioni in uso nel proprio sito Web) disponga delle autorizzazioni necessarie per accedere e leggere la directory fisica sul server in cui risiede il servizio.

Si prega di leggere this e this, chiedendomi di elaborare sarebbe solo ripetere quello che stanno dicendo.

EDIT 21/06/2012:

Ho appena scaricato il vostro servizio e ospitato in IIS ed è ospitato bene, dal momento che la sua utilizzando il protocollo HTTP e non nettcp allora che significa che funziona perfettamente bene su internet. Se il tuo servizio è qualcosa di semplice e non ti aspetti di eseguire un'elaborazione pesante con esso (a quanto sembra stai solo cercando di ottenere l'elenco dei client ad esso collegati), continua con wsDualHTTPBinding poiché il protocollo HTTP funzionerà in qualsiasi ambiente e non devi preoccuparti dei firewall come faresti con netTcpBinding.Questo è tutto quello che ho fatto per ospitare il servizio in IIS (e renderlo disponibile su internet):

  1. Vai alla DefaultWebsite in IIS, fare clic destro, aggiungere l'applicazione, sotto Alias ​​basta dare questo servizio, nome che si desidera essere in grado di vedere nell'URL. Selezionare Pool di app predefinito o pool di app ASP.NET 4.0.

  2. Puntare il percorso fisico in cui il file .svc si trova sul computer; per me la sua:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. Sotto protocolli abilitati assicurarsi di avere HTTP sulla porta 80 o qualsiasi altra porta, ad esempio 8085, ma sarà necessario inoltrare questa porta sul router per il computer host del servizio. Se l'host del servizio si trova su IP 192.168.1.4 nella LAN, quindi sulla porta di inoltro del router 80 (o sulla porta che si utilizza, ad es. 8085) sul computer 192.168.1.4.

Ed è così facile.

+0

Buona lettura davvero ... ok, non lo so più se sto andando su netTcp o su wsDual, ma, potresti per favore aiutarmi a farlo funzionare? Sono felice di mettere l'esempio implementato nel link qui sopra per lavorare ... –

+0

@TanielianBarreira, ho appena guardato l'articolo, sembra ben scritto, qual è esattamente il problema? Sta implementando un semplice servizio di chat dall'aspetto, ci sono molti esempi sui callback in WCF. il succo dell'idea è che il client chiama qualche operazione sul servizio, e il servizio può a sua volta chiamare un metodo sul client (questo è il callback), quindi il client sarà temporaneamente come un server stesso. I metodi in 'ChatService' sono ciò che i client chiamano sul server, ei metodi in' IChatServiceCallback' sono ciò che il servizio richiama sui client. –

+0

@TanielianBarreira guarda il mio aggiornamento. –

1

Il binding TCP è migliore per i callback su Internet perché il TCP è a doppia direzione per sua natura. HTTP è una richiesta, è solo un modo. Da qui il doppio in dualHttpBinding. WCF deve creare una seconda connessione HTTP al client in modo che il servizio possa inviare richieste al client.

Internet non è realmente configurato per i server da richiamare tramite HTTP. Cose come il NAT che viene eseguito dai router significa che le porte devono essere inoltrate per instradare correttamente la richiesta HTTP e il client deve essere in esecuzione su un server HTTP.

Quindi, è molto più semplice utilizzare TCP. In alternativa, o se è possibile che il client richieda un oggetto risposta che viene trasmesso in streaming dal server (una risposta senza fine in effetti), il server può attivare le notifiche. Questo non è semplice però.

+0

Grazie per la risposta, ma come posso modificare l'esempio precedente per utilizzare netTcp? –

Problemi correlati