none
[WCF] come mettere in produzione un servizio

    Domanda

  • Ciao

    Ho creato un servizio WCF per un app uwp10 e funziona senza intoppi.

    Ora vorrei provare a metterla in produzione.

    In sostanza ho una rete domestica e vorrei posizionare il servizio wcf su un pc al quale gli altri faranno riferimento. 

    Non so come fare a rendere il servizio fruibile dalle apps.

    Grazie

    venerdì 23 giugno 2017 11:30

Risposte

  • Ciao

    non scusarti, era abbastanza chiara la domanda. Quello che ho scritto era in "aggiunta" al discorso della LAN, in quanto non sapevo se dovevi usare il server in LAN come servizio per l'esterno.

    Comunque, se hai intenzione di "aprire" il servizio solo a client in LAN (non esterno) allora ti basta pubblicare il servizio nella cartella wwwroot (o comunque dove meglio credi, l'importante è che sia su IIS ovviamente) e dopo creare una regola in ingresso nel firewall se la porta non è la 80 (sulla 80 in genere c'è già la regola per iis).

    Un ultima nota: se usi visual studio per fare debug (quindi vuoi raggiungere IIS Express e non IIS) la situazione è un po differente, infatti oltre a dover autorizzare la regola in ingresso su firewall, per poter raggiungere il servizio dovrai aggiungere un binding nel config di iis express (dipende dalla versione, su 2015 ad esempio dovresti trovare una cartella dentro la cartella del progetto di nome "vs" [vs/config/applicationhost.config]) per rispondere all'ip della macchina (solitamente questo avviene tramite localhost:porta e non ipmacchina:porta) e avviare VS come amministratore. 

            <sites>
                <site name="NomeSito" id="0">
                    <application path="/" applicationPool="Clr4IntegratedAppPool">
                        <virtualDirectory path="/" physicalPath="path sito" />
                    </application>
                    <bindings>
                        <binding protocol="http" bindingInformation="*:11983:localhost" />
       (aggiunto)-----> <binding protocol="http" bindingInformation="*:11983:192.168.1.105" />
                    </bindings>
                </site>
            </sites>

    dopo puoi collegarti alla macchina tramite appunto il suo ip, che nell'esempio sopra risulta essere: 192.168.1.105:11983


    • Modificato U 235 sabato 24 giugno 2017 19:32
    • Contrassegnato come risposta Cracken66 martedì 27 giugno 2017 14:17
    sabato 24 giugno 2017 19:11
  • Non avevo aggiunto:

               <netTcpBinding>
                    <binding name="NetTcpBinding_IService1" />
                </netTcpBinding>
    

    nel config del client.

    Ciao e grazie

    • Contrassegnato come risposta Cracken66 martedì 27 giugno 2017 14:17
    martedì 27 giugno 2017 14:16

Tutte le risposte

  • Ciao

    in teoria dovrebbe bastare attivare la regola per la connessione in entrata sul firewall del pc che fa girare il servizio, ovviamente sulla porta corretta. Dopo devi attivare una regola nel router (magari tramite nat o virtual server) che consenta l'accesso su una porta esterna, che a sua volta "passa" la richiesta all'ip e la porta del pc con il servizio.

    Esempio:

    IP PC = 10.0.0.10:1234 (ip interno lan e porta 1234)

    IP esterno = 234.234.234.1 (ip pubblico del router)

    regola NAT router= (IP=10.0.0.10 porta esterna=80*, porta interna=1234)

    regola firewall PC = (abilita regola in entrata porta TCP 1234) 

    Ora per chiamare il servizio dovrai usare l'ip 234.234.234.1 senza specificare la porta, in quanto usi la 80 di default. Diversamente se dovessi avere problemi ad usare la 80 (capita spesso per svariati motivi) puoi impostare una qualsiasi altra porta (ad esempio 8080), ma a quel punto dovrai modificare anche la regola nel NAT di conseguenza. Quindi il servizio lo raggiungi da "http://234.234.234.1:8080".

    Detto questo è possibile che il tuo router con linea domestica non abbia un ip fisso, in questo caso devi trovare un servizio di DNS dinamico e dovrai configurarlo opportunamente (ci sono quelli utilizzabili subito sul router, oppure installando robe sul server). A questo punto potrai chiamare il servizio tramite un nome a dominio che di solito ti viene fornito con il servizio dns dinamico), ovviamente nel caso aggiungendo la porta (es: http://pchome.dyndns.org:8080).

    Ora se il servizio è funzionante dovresti riuscire a raggiungerlo. A limite dovrai configurare il .config dei client che si connettono al servizio con il nuovo indirizzo.

    Altra possibilità è fare in modo che non sia il servizio (di casa) ad essere chiamato dal client, ma il "servizio" di casa (non servirebbe più un servizio, ma un client) invia dati costanti ad un server esterno (tipo hosting), e quest'ultimo serve le richieste al client fornendo gli ultimi dati ricevuti dal pc di casa. in questo caso dimentica tutte le configurazioni dette in precedenza, ma non serve nemmeno più il servizio. Ma questo dipende molto da cosa devi fare.

    Ultima nota: in realtà se ti appoggi ad hosting esterno non avresti bisogno di un servizio esterno per l'ip dinamico, ti basta fare in modo che il server di casa invii il suo ip esterno quando cambia direttamente al server, in questo modo ogni volta che cambia l'ip, il server restituisce ai client connessi che lo hanno chiamato (dominio esterno) il nuovo indirizzo. Ma questo dipende molto da cosa devi fare (come sopra).

    Ricorda inoltre che una linea "casalinga" non ti reggerà troppe connessioni simultanee, per quello ti parlo di hosting esterno. E se dovesse essere necessario avere un servizio "a casa" (es: stazione meteo) da rendere pubblico tramite hosting esterno, allora valuta la possibilità che ti ho detto in precedenza.

    venerdì 23 giugno 2017 15:06
  • Chiedo scusa, ma probabilmente non sono stato molto chiaro nel porre la domanda.

    La rete in cui deve essere disponibile il servizio è quella domestica ed io ero interessato a capire come distribuirlo e quale metodo.

    Tuttavia le informazioni che mi hai fornito sono molto interessanti e chiare e di questo ti ringrazio.

    Grazie di nuovo

    sabato 24 giugno 2017 18:08
  • Ciao

    non scusarti, era abbastanza chiara la domanda. Quello che ho scritto era in "aggiunta" al discorso della LAN, in quanto non sapevo se dovevi usare il server in LAN come servizio per l'esterno.

    Comunque, se hai intenzione di "aprire" il servizio solo a client in LAN (non esterno) allora ti basta pubblicare il servizio nella cartella wwwroot (o comunque dove meglio credi, l'importante è che sia su IIS ovviamente) e dopo creare una regola in ingresso nel firewall se la porta non è la 80 (sulla 80 in genere c'è già la regola per iis).

    Un ultima nota: se usi visual studio per fare debug (quindi vuoi raggiungere IIS Express e non IIS) la situazione è un po differente, infatti oltre a dover autorizzare la regola in ingresso su firewall, per poter raggiungere il servizio dovrai aggiungere un binding nel config di iis express (dipende dalla versione, su 2015 ad esempio dovresti trovare una cartella dentro la cartella del progetto di nome "vs" [vs/config/applicationhost.config]) per rispondere all'ip della macchina (solitamente questo avviene tramite localhost:porta e non ipmacchina:porta) e avviare VS come amministratore. 

            <sites>
                <site name="NomeSito" id="0">
                    <application path="/" applicationPool="Clr4IntegratedAppPool">
                        <virtualDirectory path="/" physicalPath="path sito" />
                    </application>
                    <bindings>
                        <binding protocol="http" bindingInformation="*:11983:localhost" />
       (aggiunto)-----> <binding protocol="http" bindingInformation="*:11983:192.168.1.105" />
                    </bindings>
                </site>
            </sites>

    dopo puoi collegarti alla macchina tramite appunto il suo ip, che nell'esempio sopra risulta essere: 192.168.1.105:11983


    • Modificato U 235 sabato 24 giugno 2017 19:32
    • Contrassegnato come risposta Cracken66 martedì 27 giugno 2017 14:17
    sabato 24 giugno 2017 19:11
  • Ciao,

    ci sono vari modi per mettere in produzione un servizio che puoi vedere nella documentazione ufficiale MS qui: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/hosting.

    Non ne faccio un grande uso ma quelle poche volte sono andato per la scelta più ovvia: ospitarlo in IIS.

    Una volta ospitato in IIS devi rendere accessibile in LAN la porta su cui lo pubblichi quindi verifica eventuali impostazioni del firewall. Tipicamente dovrai consentire connessioni in ingresso sulla porta 80.

    Saluti,

    Michele

    domenica 25 giugno 2017 14:19
  • Grazie

    Devo dire che sei stato veramente chiaro.

    Uso VS20177 ed ho pubblicato il servizio su IIS e funziona correttamente.

    Volevo provare anche un protocollo diverso, il tcp quindo ho aggiunto il protocollo al sito in IIS ed ho configurato il config del client in questo modo:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IService1" />
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost/TestWCF/wcftest.service1.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
                    contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" />
                <endpoint address="net.tcp://localhost/TestWCF/wcftest.Service1.svc"       
                    binding="netTcpBinding" contract="ServiceReference1.IService1"        
                    name="NetTcpBinding_IService1" />
            </client>
        </system.serviceModel>
    </configuration>

    ed ho implementato in servizio nel client con:

    ServiceReference1.Service1Client client = new ServiceReference1.Service1Client("NetTcpBinding_IService1");

    Avvio il client ed ottengo il seguente errore:

    "System.ServiceModel.EndpointNotFoundException: 'Impossibile connettersi a net.tcp://localhost/TestWCF/wcftest.Service1.svc. Il tentativo di connessione è durato per un periodo di tempo di 00:00:02.0016366. Codice di errore TCP 10061: Impossibile stabilire la connessione. Rifiuto persistente del computer di destinazione 127.0.0.1:808. '
    "

    Grazie

    lunedì 26 giugno 2017 05:51
  • Grazie, ora vorrrei provare a connettermi tramite tcp come vedi in risposta ad "U 235"

    CIao

    lunedì 26 giugno 2017 05:53
  • Ciao,

    puoi mostrarmi il config dell'app client? mi sa che stai chiamando ancora localhost.

    EDIT:

    guarda qua :

    <endpoint address="http://localhost/TestWCF/wcftest.service1.svc"


    • Modificato U 235 lunedì 26 giugno 2017 13:52
    lunedì 26 giugno 2017 13:34
  • Però ho specificato il nome dell'endpoint utilizzato dal client nel costruttore del serviceclient.

    Grazie

    lunedì 26 giugno 2017 16:13
  • Non avevo aggiunto:

               <netTcpBinding>
                    <binding name="NetTcpBinding_IService1" />
                </netTcpBinding>
    

    nel config del client.

    Ciao e grazie

    • Contrassegnato come risposta Cracken66 martedì 27 giugno 2017 14:17
    martedì 27 giugno 2017 14:16
  • Ciao,

    bene :) mi fa piacere che tu sia riuscito a trovare la soluzione.

    A presto.

    martedì 27 giugno 2017 16:58