Я размещаю службу WCF внутри приложения WPF. Я бы хотел, чтобы WCF могла общаться со своим хостом. В частности, я хотел бы получать уведомления о событиях от WCF, когда определенные методы WCF вызываются клиентами.

Я попытался изменить свой WCF так, чтобы он был синглтоном:

[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()
    {
    }

И наличие основной формы приложения WPF для размещения, использующего свойство Instance для взаимодействия с WCF, но это, похоже, не работает. Это похоже на то, как если бы вызов от клиента к WCF создает экземпляр нового WCF. Помощь!

2
3Dave 8 Окт 2009 в 01:26

2 ответа

Лучший ответ

Возможно, вы неправильно запускаете свой ServiceHost. Когда вы используете InstanceContextMode.Single, вы должны создать свой ServiceHost с этим конкретным экземпляром:

var host = new ServiceHost(_instance);
//...
host.Open();
1
Mark Seemann 8 Окт 2009 в 01:35
Вот что я понял. Я пошел дальше и опубликовал более длинный ответ, но ваш ответ точен. Спасибо!
 – 
3Dave
8 Окт 2009 в 01:38

Нашел работающий ответ.

Мой конструктор главного окна WPF выглядит так:

   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();

        }

Я также изменил класс обслуживания, добавив атрибут:

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

Затем объект serviceHost использует явно созданный мной экземпляр. Обратите внимание, что параметр, переданный конструктору ServiceHost, является экземпляром MasterNode, а не ссылкой на тип.

Надеюсь, это поможет кому-то другому!

0
3Dave 8 Окт 2009 в 01:37