WCF与托管应用程序通信?

时间:2009-10-07 21:26:11

标签: c# wpf wcf service

我在WPF应用程序中托管WCF服务。我希望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()
    {
    }

并使用Instance属性与托管WPF应用程序的主要形式与WCF交互,但这似乎不起作用。这几乎就像从客户端到WCF的调用实例化了一个新的WCF。救命啊!

2 个答案:

答案 0 :(得分:1)

然后,您可能会以错误的方式提升您的ServiceHost。当您使用InstanceContextMode.Single时,您应该使用该特定实例创建ServiceHost:

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

答案 1 :(得分:0)

找到一个有效的答案。

我的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的实例,而不是类型引用。

希望这有助于其他人!