2009-10-07 7 views
2

J'héberge un service WCF à l'intérieur d'une application WPF. Je voudrais que la WCF puisse communiquer avec son hôte. Plus précisément, j'aimerais recevoir des notifications d'événements du WCF lorsque certaines méthodes WCF sont appelées par les clients.WCF communique avec l'application d'hébergement?

J'ai essayé de modifier mon WCF être un singleton comme ceci:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public sealed class MasterNode : ServiceBase, IMasterNode 
{ 
    private static readonly MasterNode _instance = new MasterNode(); 
    public static MasterNode Instance { get { return _instance; } } 

    private MasterNode() 
    { 
    } 

    static MasterNode() 
    { 
    } 

et ayant la forme principale de l'application WPF d'hébergement en utilisant la propriété de l'instance d'interagir avec le WCF, mais cela ne semblent fonctionner. C'est presque comme si l'appel du client à la WCF instancie un nouveau WCF. Aidez-moi!

Répondre

1

Il est possible que votre ServiceHost tourne dans le mauvais sens. Lorsque vous utilisez InstanceContextMode.Single, vous devez créer votre ServiceHost avec ce cas particulier:

var host = new ServiceHost(_instance); 
//... 
host.Open(); 
+0

C'est ce que j'ai compris. Je suis allé de l'avant et posté une réponse plus longue, mais la vôtre est exacte. Merci! –

0

trouvé une réponse qui fonctionne.

principal constructeur de la fenêtre Mon WPF ressemble à ceci:

public partial class Main : Window 
    { 
     private ObservableCollection<GridNodeProxy> _gridNodes = new ObservableCollection<GridNodeProxy>(); 
     private static Random _random = new Random(); 
     public MasterNode MasterNode { get; set; } 
     private ServiceHost _serviceHost; 

     public Main() 
     { 
      this.MasterNode = new MasterNode(); 
      MasterNode.OnMessage += MasterNodeMessage; 


      _serviceHost = new ServiceHost(MasterNode); 
      _serviceHost.Open(); 

      InitializeComponent(); 

     } 

J'ai aussi modifié la classe de service en ajoutant l'attribut:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class MasterNode : ServiceBase, IMasterNode 

L'objet ServiceHost utilise alors l'instance I explicitement créé . Notez que le paramètre passé au constructeur ServiceHost est une instance de MasterNode, pas une référence de type.

J'espère que cela aide quelqu'un d'autre!