我在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。救命啊!
答案 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的实例,而不是类型引用。
希望这有助于其他人!