Remoting, Windows Service e Client

lunedì 21 gennaio 2008 - 19.40

astroman Profilo | Junior Member

Salve a tutti,
sto studiando per creare un windows service al quale sia possibile connettersi da un secondo applicativo via net remoting...ho creato il marshaledobject e referenziato nel windows service attraverso IPC...però ora il mio dilemma è fare il client e vi spiego il motivo: in pratica la mia soluzione suddivisa in 2 progetti, uno per l'oggetto marshaled e l'altro per il windows service, compilati vivranno nello stesso applicativo...ma poi, leggendo i vari su internet, per la creazione del client IPC dovrei referenziare l'interfaccia nel client...

Il problema fondamentale è che tutti gl'esempi fan vedere il client che risiede nella stessa soluzione del server e dell'oggetto marshaled..ma come farei io a collegarmi, per es, via rete?

Se sono stato confuso nella mia richiesta chiedo venia...ma è confusa la conoscenza dell'argomento dato che in internet si trovano poche informazioni e confuse...

Magari se qualcuno può darmi una mano con qualche esempio...mi farebbe cosa molto gradita!

Grazie e ciao a tutti

AndreaKpr Profilo | Senior Member


Ciao.
Se hai capito come gira il lato sever la chiamata client è il minore dei mali.
Nel senso che negli esempi che avrai visto come identificativp della machina chiamata ci sarà stato localhost.
Se devi puntare da un altra parte basta mettere l'ip... Specificando il protocollo, tipo : Tcp:\\192.168.192.1\TuoClasse
Saluti.

astroman Profilo | Junior Member

Beh veramente no...è il più grande dei miei mali...

Anche perchè non sto usando TCP bensi IPC...e quindi non saprei come fare senza referenziare l'interfaccia

Forse è il caso che faccia un pò di esempi...

Allora, iniziamo

1) REMOTE OBJECT

Progetto RemotingObject
Public Class RemoteObject Inherits MarshalByRefObject Public Sub New() End Sub Public Sub DoSomething() End Sub Public Sub ThreadProc() End Sub End Class

2) Windows Service
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


E ora...il client....come lo faccio??

AndreaKpr Profilo | Senior Member


Ciao scusa l'ignoranza ma non so cosa sia il protoollo IPC

cmq, dal codice vedo che hai registrato il canale lato server... bene
Ora devi registrare il canale lato client ed instazionare la referenza alla tua classe...

>>private TcpClientChannel DbChannel = new TcpClientChannel();
>>String url = "tcp://192.168.92.1:50000/tuaclasse"

>>ChannelServices.RegisterChannel(DbChannel, false);

>>TuaClasse TcClasse = (TuoNameSpace)Activator.GetObject(typeof(TuoNameSpace_Generale), url ;

>>TcClasse.tuoMedoto ecc ecc

alla fine chiudi il canale

>> ChannelServices.UnregisterChannel(DbChannel);

Spero di essere stato chiaro...

Andrea



astroman Profilo | Junior Member

Beh l'IPC Channel è il nuovo protocollo implementato su NET 2.0

Per risolvere la situazione ho deciso di implementare un interfaccia in modo tale da poterla compilare su una DLL e distribuire sui miei applicativi.

Ecco il Codice

1) Interfaccia
Namespace IRemotingObject
Public Interface IRemoteObject Sub ReplicaTaskManual() End Interface
2) Oggetto da "remotare" (passatemi il termine!)
Public Class RemoteObject Inherits MarshalByRefObject Implements IRemotingObject.IRemoteObject Public Sub ReplicaTaskManual() Implements IRemotingObject.IRemoteObject.ReplicaTaskManual '.... End Sub End Class

3) Windows Service

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

4) Client su Windows Form
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Devo ancora iniziare la fase di test ma a livello teorico, in base a quello letto sul Web, dovrebbe funzionare...o no?

AndreaKpr Profilo | Senior Member

Ciao, cercando in giro ho letto che il protocollo IPC non implementa la struttura via rete (per questo più veloce)

Leggi, qui ...
http://msdn2.microsoft.com/it-it/library/system.runtime.remoting.channels.ipc(VS.80).aspx

Il tuo metodo è corretto se non vai ad interrogare pc in Lan (quindi passare informazioni tra vari processi, sulla stessa macchina)
In alternativa devi usare la remotizzazione via tcp...

Il codice diventerebbe del tutto simile, ma cambiando classi ed metodi.

CiriCIao.

astroman Profilo | Junior Member

No il discorso è proprio questo: il mio applicativo si svolge tutto ed esclusivamente sul pc e non chiamandolo da pc remoti!

Il mio problema è un altro ora e non riesco a risolverlo...ho il servizio che funziona perfettamente ma la chiamata del client via remoting parte ma mi da errore di "Accesso Negato"....

Consigli?

AndreaKpr Profilo | Senior Member

Ok, prima avevi postato che volevi chiamare il servizio da rete...
Mi posti bene l'errore ???
Grazie ;)

astroman Profilo | Junior Member

"Failed to connect to an IPC Port: Accesso negato."

astroman Profilo | Junior Member

Trovata la soluzione!

In pratica sul windows service la chiamata bisogna modificarla così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In pratica dico di autorizzare tutto il gruppo "Everyone" di utilizzare il remoting!

AndreaKpr Profilo | Senior Member

Grande !!!
Non ho potuto risponderti prima, ma cmq mi pareva un errore di permessi...
Infatti l'hai risolto in modo corretto, bye!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5