WCF net tcp服务对象具有null事件

本文关键字:null 事件 对象 net tcp 服务 WCF | 更新日期: 2023-09-27 18:26:28

我有一个WCF服务,它只使用一个方法"foo"来实现服务契约。

[ServiceContract]
public interface IWCFService
{
    [OperationContract]
    void Foo(MyEntity entity);
}

我正在用一些添加的属性和一个事件来实现这个接口。

internal class MyWCFService : IWCFService
{
    public event EventHandler MyEvent;
    public string Name { get; set; }
    private ServiceHost WCFServiceHost { get; set; }
    internal MyWCFService()
    {
        NetTcpBinding tcpBinding = new NetTcpBinding();
        tcpBinding.Security.Mode = SecurityMode.None;
        WCFServiceHost = new ServiceHost(typeof(MyWCFService), new Uri[] { new Uri("net.tcp://xxx.xxx.xxx.xxx:61243") });
        WCFServiceHost.AddServiceEndpoint(typeof(IWCFService), tcpBinding, "MyWCFService");
    }
    internal void Start()
    {
        WCFServiceHost.Open();            
    }
    internal void Stop()
    {
        this.WCFServiceHost.Close(new TimeSpan(0, 0, 1));
    }
    void IWCFService.Foo(MyEntity entity)
    {
        //Business logic...
        ThrowEvent(entity);
    }
    private void ThrowEvent(MyEntity entity)
    {
        if (this.MyEvent != null) //this.MyEvent is always null even though I'd successfully suscribe a function in another class
        {
            this.MyEvent(entity);
        }
    }
}

在同一服务器应用程序中的另一个类上,我支持"MyEvent"。

public class AnotherClass
{
    internal MyWCFService TheService { get; set; } = new MyWCFService();
    public void Start()
    {
        this.TheService.MyEvent += FunctionThatDoesSomethingWithMyEntity;
        //Breakpoint here, this.TheService.MyEvent has 1 suscriber
        this.TheService.Start();
    }
    private void FunctionThatDoesSomethingWithMyEntity(MyEntity entity)
    {
         //More logic...
    }
}

问题是,尽管我已经向调试器检查了函数FunctionThatDoesSomethingWithMyEntity已成功订阅OtherClass.Start()中的MyEvent,但当客户端调用WCF服务方法Foo时,MyEvent为null

此外,我在Foo内部的断点处停止时注意到以下错误:
错误CS1061:MyWCFService不包含MyWCF的定义,也找不到接受第一个"MyWCFServices"类型参数的扩展方法MyWCF(是否缺少using指令或程序集引用?)

我相信,每次客户端调用Foo时,都会创建一个新的MyWCFService对象,因此MyEvent为空,对此有解释吗?

WCF net tcp服务对象具有null事件

事件不能像您期望的那样在WCF中工作。不过,这个问题可能会帮助您。基本上,您需要使用回调。

编辑:由于您不是通过WCF而是在服务器/WCF项目的另一个类中澄清并尝试绑定到事件,因此您的假设是正确的,即创建的WCF客户端的每个实例都会产生一个新类,因此会丢失事件绑定。我不能保证它会工作,因为我现在不能测试它,但你可以尝试将事件设置为"静态",这样它就不会随着每个新的类实例而创建。