2009-12-11 6 views
6

Sto scrivendo un servizio di Windows che eseguirà molte comunicazioni di rete e ho bisogno di un modo per avvisare un utente (se connesso) di qualsiasi eccezioni/errori. So che è una cattiva pratica consentire a un servizio di interagire con il desktop, quindi c'è un modo alternativo per avvisare un utente che si è verificato un errore? Sono a conoscenza della registrazione degli eventi, ma vorrei anche essere in grado di mostrare un fumetto di notifica dalla barra delle applicazioni o qualcosa che attiri l'attenzione dell'utente.Il modo migliore per un servizio Windows .Net per segnalare un errore all'utente

risposta

7

Si prega di considerare l'uso del registro eventi e un'applicazione separata solo per il monitoraggio. Puoi anche considerare l'uso di email o MSMQ.

4

Che ne pensi di utilizzare un'altra app per interagire con questa applicazione e avvisare l'utente degli errori? In questo modo puoi avere "opzione" per gli utenti. Possono essere disattivati ​​avvisi, e-mail, ecc.

5

In genere, è disponibile un'app secondaria che il servizio può notificare. Ad esempio, è possibile avere un'icona nella barra delle applicazioni (ugh) che visualizza i fumetti (doppio ugh) quando si verifica qualcosa di importante. L'app stessa può quindi presentare un'interfaccia per le impostazioni del servizio.

2

È necessario fornire un'alternativa all'opzione "interagire con il desktop". Non è più supportato in Vista e Win7. Concedere un accesso utente limitato a un'interfaccia utente che viene eseguito su un account con privilegi elevati è stato considerato un rischio di protezione troppo elevato. Google "isolamento sessione 0" per trovare i dettagli su questo.

È necessario utilizzare uno dei meccanismi di interoperabilità di processo supportati da .NET per configurare l'interazione tra il servizio e l'app dell'interfaccia utente. Per il semplice passaggio di messaggi utilizzare un socket o una named pipe. Il nome del pipe deve avere il prefisso "Global \" per essere visibile a tutte le sessioni. Per interazioni più complesse puoi usare Remoting o WCF.

Assicurarsi di considerare la possibilità che l'utente decida di non eseguire o uccidere l'app desktop. È necessario registrare qualsiasi errore con la classe EventLog.

1

Per risolvere questo problema, ho creato un'applicazione Windows Form che l'utente può avviare e interrompere a proprio piacimento. Naturalmente, il servizio di Windows è in esecuzione in background 24/7. Quando l'applicazione viene avviata, utilizza Windows Communication Foundation (WCF) per interrogare il servizio per il suo stato corrente - è attivo, quanti client sono connessi, quanti byte sono stati raccolti, ecc. Queste informazioni vengono quindi presentate all'utente all'interno dell'applicazione.

Ho provato a simulare il comportamento di Task Manager, quindi ho anche aggiunto uno System.Windows.Forms.NotifyIcon al modulo principale dell'applicazione che visualizza un'icona nella barra delle applicazioni. Quando l'applicazione è aperta, viene visualizzata l'icona della barra delle applicazioni. L'utente può minimizzare l'applicazione alla barra delle applicazioni o può nascondere l'applicazione del tutto. L'icona del vassoio si spegne solo quando l'utente chiude l'applicazione. L'icona del vassoio supporta anche il doppio clic per riaprire l'applicazione e un menu a comparsa per un rapido accesso alle funzionalità.

In ogni caso, il punto che voglio sottolineare è che WCF è il modo più semplice per comunicare con il servizio e l'applicazione front-end. La gente discuterà della presunta curva di apprendimento "ripida" associata alla WCF, ma non l'ho sperimentato. Trovo che WCF sia un modo molto efficiente per sviluppare la comunicazione tra processi. Puoi guardare this video per darti un'idea del paradigma di programmazione della WCF.