2017-10-20 55 views
-1

J'ai donc un projet installé avec un service et un formulaire. Le service charge les fichiers XML créés par le formulaire. Le problème est depuis le chemin de service et formulaire AppDatas sont différentes en utilisantComment communiquer correctement entre le service et le formulaire en utilisant XML

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

je devais installer le service sur le compte utilisateur plutôt que le système local. Je remarque que la plupart des services sont installés en tant que système local. Comment cela affecterait-il la performance du service, ou y a-t-il une meilleure façon d'aborder cela?

+0

Le système n'a pas d'environnement, donc il n'y a pas de chemin vers le dossier. Je pense que le processus normal consiste à avoir un projet dans un compte admin, puis à l'exécuter en tant qu'administrateur. L'exécution en tant que compte d'utilisateur est équivalente, mais l'utilisateur aura alors accès à la modification (sauf si vous êtes l'utilisateur). Les performances sont basées sur la définition de la priorité du service. Souvent, un service exécuté en tant que service système est configuré pour s'exécuter à une priorité normale, de sorte qu'il n'affecte pas les performances du système d'exploitation. Donc, tout service la priorité doit être définie en fonction de ses exigences. – jdweng

Répondre

0

Votre question est trop large. Il existe de nombreuses façons d'aborder votre scénario. Cela dit, puisque vous avez déjà une implémentation, nous pouvons le commenter pour répondre aux parties spécifiques de votre question. Tout d'abord, l'exécution en tant qu'utilisateur normal devrait être bonne, en supposant que le service fonctionnera correctement sous ce compte. Ce n'est pas idéal, mais cela ne devrait pas vraiment blesser quoi que ce soit. Généralement, un service nécessite des privilèges élevés, ce qui explique à la fois pourquoi il s'agit d'un service et pourquoi il est exécuté en tant que compte de système local ou de service local. Mais si votre service ne nécessite pas ces privilèges, l'utilisation d'un compte d'utilisateur est très bien. Cela dit, d'après votre description, il semble que le programme GUI contrôle le service en écrivant des fichiers XML dans un emplacement spécial que le service surveille et lit. Cette utilisation du système de fichiers comme une forme de communication inter-processus (IPC) n'est pas idéale et je recommanderais une approche différente.

Étant donné que vous avez déjà des E/S basées sur XML, je suggère d'utiliser des canaux nommés ou un autre IPC réseau/socket. Vous pouvez envelopper un objet de flux (par exemple PipeStream ou NetworkStream) dans un StreamWriter et StreamReader, puis utiliser les éléments XML normaux que vous utilisez déjà pour lire et écrire en conséquence.

Une autre alternative est WCF. Il y a une petite courbe d'apprentissage, et vous avez un peu moins de contrôle sur la sérialisation précise utilisée pour transmettre vos données, mais l'avantage est qu'avec Visual Studio, vous passez moins de temps à implémenter le côté XML/sérialisation, et Vous pouvez créer de nouveaux clients pour le service simplement en les ajoutant dans Visual Studio. L'EDI créera les structures de données et la configuration nécessaires pour se connecter au service. Dans l'un ou l'autre cas, vous pouvez exécuter votre service sous le compte Système local, comme le ferait un service, et le problème que vous posez est résolu. :)