Domanda

Con .Net qual è il modo migliore per interagire con un servizio (es.come comunica la maggior parte delle app nella barra delle applicazioni con i propri server).Sarebbe preferibile se questo metodo fosse anche multipiattaforma (lavorando in Mono, quindi immagino che la comunicazione remota sia fuori uso?)


Modificare:

Dimenticavo di menzionare che dobbiamo ancora supportare le macchine Windows 2000 sul campo, quindi WCF e qualsiasi cosa superiore a .Net 2.0 non funzioneranno.

È stato utile?

Soluzione

Tieni presente che se prevedi di eseguire la distribuzione su Windows Vista o Windows Server 2008, molti modi in cui ciò può essere fatto oggi non funzioneranno.Ciò è dovuto all'introduzione di una nuova funzionalità di sicurezza chiamata "Isolamento sessione 0".

La maggior parte dei servizi Windows sono stati spostati per essere eseguiti nella Sessione 0 ora per isolarli correttamente dal resto del sistema.Un'estensione di ciò è che il primo utente che accede al sistema non viene più inserito nella Sessione n. 0, ma nella Sessione 1.Pertanto, l'isolamento interromperà il codice che esegue determinati tipi di comunicazione tra servizi e applicazioni desktop.

Il modo migliore per scrivere codice oggi che funzionerà su Vista e Server 2008 in futuro durante la comunicazione tra servizi e applicazioni è utilizzare un'API cross-process adeguata come RPC, Named Pipes, ecc.Non utilizzare SendMessage/PostMessage poiché ciò fallirebbe con l'isolamento della sessione 0.

http://www.microsoft.com/whdc/system/vista/services.mspx

Ora, date le tue esigenze, ti troverai un po' nei guai.Per quanto riguarda la multipiattaforma, non sono sicuro che la comunicazione remota sia supportata.Potrebbe essere necessario scendere e tornare indietro ai socket: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

Altri suggerimenti

Se si tratta di un'applicazione nella barra delle applicazioni e non di un vero servizio, fai attenzione a come imposti le comunicazioni se utilizzi pipe o TCP/IP.Se più utenti hanno effettuato l'accesso a una macchina (Citrix, Desktop remoto) e ciascun utente avvia un "servizio" dell'app della barra delle applicazioni, è possibile imbattersi in una situazione in cui più processi tentano di utilizzare la stessa porta o pipe ben nota.Ovviamente questo non è un problema se non prevedi di supportare più pipe o se disponi di un vero servizio invece di un'app nella barra delle applicazioni che viene eseguita in ciascuna shell utente.

Chiedi al tuo servizio di ascoltare 127.0.0.1 su una porta predefinita con un semplice vecchio socket di flusso TCP.Connettiti a quella porta dalla tua applicazione desktop.

È semplicissimo ed è completamente multipiattaforma.

Qualcuno di voi ha effettivamente provato la comunicazione remota con Mono?Funziona perfettamente.Potresti imbatterti in alcuni casi limite, ma questo è altamente improbabile.Basta testare di tanto in tanto la tua applicazione per la comunicazione remota multipiattaforma (MS.Net <-> Mono) per individuare eventuali problemi.E inizia con un Mono recente, la versione 2.4.2 è attuale.

La comunicazione remota è un'opzione, ma non è multipiattaforma.Alcuni altri modi consistono nell'utilizzare pipe denominate, IPC o eventi del kernel.

Stranamente stavo per suggerire Remoting!IL Note sulla versione di Mono 1.0 (da archive.org perché manca la posizione originale) menziona System.Runtime.Remoting.dll come libreria supportata e non dice nulla sui problemi noti.

Se la comunicazione remota non è disponibile, probabilmente dovrai implementare il tuo protocollo di framing dei messaggi TCP.Windows non dispone di un equivalente dei socket del dominio UNIX per la comunicazione sulla stessa macchina.

La maggior parte dei servizi che dispongono di un componente GUI vengono eseguiti come utente denominato e possono accedere al desktop.Ciò ti consente di accedervi tramite COM o .NET ma solo localmente (a meno che tu non voglia complicarti)

Personalmente, apro un normale vecchio socket sul servizio: la sua piattaforma multipiattaforma, consente a più client, consente a qualsiasi app di accedervi, non fa affidamento sulla sicurezza di Windows per essere aperto e consente alla tua GUI di essere scritta in qualsiasi la lingua che preferisci (poiché tutto supporta i socket).

Per un'app vassoio, vorresti che un protocollo semplice comunicasse: potresti anche utilizzare un sistema in stile REST per inviargli comandi e trasmettere in streaming XML (yuk) o un formato dati personalizzato.

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