IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

Générer une notification depuis l'hôte d'un service WCF


Sujet :

Développement Windows

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Générer une notification depuis l'hôte d'un service WCF
    Bonjour à tous,

    Je fais appel à votre aide car je rencontre quelques difficultés dans la définition de l'architecture du futur logiciel de ma société.
    Je vous expose donc l'idée de base sur laquelle je travaille

    En ce qui concerne l'environnement technique, je travaille sous Visual Studio 2015 en C# et mes applications doivent tourner sur un Windows 10 classique.

    Je souhaiterais réaliser le système suivant :
    • Un service Windows qui exposera un service WCF.
    • Ce même service Windows aura la possibilités de faire apparaître des bulles de notification. Actuellement les notifications sont gérées par l'objet NotifyIcon, développé par Philipp Sumi (http://www.hardcodet.net/wpf-notifyicon), hébergé dans une fenêtre WPF.
    • Une autre application WPF proposera une ihm exposant un bouton et un champ de saisie. Lorsque l'utilisateur cliquera sur le bouton, les informations contenues dans le champ de saisie seront récupérées et communiquées au service WCF. Le service WCF devra ensuite pouvoir demander à l'objet NotifyIcon d'afficher les informations qui lui ont été transmises par la seconde application.


    J'ai pour l'instant réussi à héberger mon service WCF dans mon service Windows. J'arrive bien à consommer le service WCF depuis la seconde application pour communiquer les données contenues dans le champ de saisie. C'est à partir de là que ça coince...

    J'avais initialement chargé le service WCF lui-même d'instancier l'objet NotifyIcon afin de faire apparaître la notification, j'ai obtenu un message d'erreur m’indiquant que « Le thread appelant doit être en mode STA »… En me renseignant, j’ai cru comprendre qu’un nouveau Thread était créé pour exécuter les fonctions contenues dans mon service lorsque la seconde application y fait appel et qu’il est impossible de mettre à jour une IHM « en direct » en dehors du thread principal de mon application. Fort de ce constat (et après avoir compris que de toute façon le fait d’instancier un nouvel objet NotifyIcon à chaque utilisation de mon service WCF était une très mauvaise idée…) j’ai déclaré un NotificationManager, instancié au démarrage du service Windows, instanciant lui-même l’objet NotifyIcon. L’idée était qu’à chaque appel de la fonction ajoutNotification() de mon service WCF, le NotificationManager soit informé qu’il doit générer une nouvelle notification.

    Mon problème actuel est que je n’arrive pas à faire en sorte que mon service WCF « communique » avec le NotificationManager pour l’informer qu’une nouvelle notification doit être affichée…

    Avez-vous une solution, idée, piste pour me permettre d’avancer sur mon problème ?

    J’espère avoir été assez clair, si ce n’est pas le cas n’hésitez pas à me demander plus d’informations.

    Je vous remercie par avance !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Il semblerait que mon sujet n'inspire pas grand monde.

    Je vous fais tout de même part de mon avancé et de l'état actuel de mon problème. Pour simplifier le problème, mon service WCF est à présent hébergé par une application WPF (FenetreWPF1).Une autre application WPF (FenetreWPF2) se connecte au service WCF afin de transmettre des informations à FenetreWPF1. La transmission des informations entre le service et la fenêtre qui l'héberge est réalisée en déclarant un événement dans le service et en s'y abonnant depuis la fenêtre hôte. Voila pour la théorie, en pratique, ça ne fonctionne pas...

    En effet il semblerait que l'abonnement de la fenêtre à l'événement du service ne soit pas pris en compte.

    Voici ma classe implémentant l'interface du service WCF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Single)]
        public class SenderService : IServiceCorrectionSender
        {
            public static event EventHandler<CorrectionReceivedEventArgs> CorrectionReceivedEvent;
     
            public void SendCorrection(Arg mt)
            {
                MessageBox.Show("Client connecté");
                var crea = new CorrectionReceivedEventArgs {Mt = mt};
     
                if(CorrectionReceivedEvent != null)
                    CorrectionReceivedEvent(null, crea);
                else
                    MessageBox.Show("Pas d'abonnement à l'évenement");
            }
        }
     
        public class CorrectionReceivedEventArgs : EventArgs
        {
            public string Sender;
            public Arg Mt;
        }
    Et voici le code de ma classe créant l'instance du service et abonnant l'une de ses méthodes à l'événement levé par celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public partial class App : Application
    {
        private MainWindow window;
     
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            window = new MainWindow();
     
            ServiceHost serviceHost = new ServiceHost(typeof (SenderService));
            SenderService.CorrectionReceivedEvent += CorrectionReceived;
            serviceHost.Open();
        }
     
        private void CorrectionReceived(object sender, CorrectionReceivedEventArgs e)
        {
            window.AddEnvoi(e.Mt);
     
            MessageBox.Show("Correction received by App.xaml.cs");
        }
    }
    Lorsque l'application 2 tente de communiquer des informations à l'application 1, la MessageBox "Pas d'abonnement à l'évenement" est affichée...

    Voyez - vous une erreur quelque part dans mon code?

    Merci d'avance à tous ceux qui tenteront de m'aider!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer une notification depuis un service android
    Par azstar dans le forum Android
    Réponses: 2
    Dernier message: 09/07/2012, 11h26
  2. Générer une facture depuis plusieurs devis
    Par bssouf21 dans le forum Microsoft Dynamics CRM
    Réponses: 2
    Dernier message: 30/12/2011, 02h51
  3. Réponses: 1
    Dernier message: 06/07/2011, 12h48
  4. Eclipse - plugin - générer une DTD depuis un fichier XML
    Par Invité dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 06/02/2009, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo