Объект службы WCF net tcp имеет нулевое событие

У меня есть служба 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 успешно подписалась на MyEvent в OtherClass.Start() , когда клиент вызывает метод службы WCF Foo, MyEvent имеет значение null.

Кроме того, я заметил следующую ошибку при остановке в точке останова внутри Foo:
ошибка CS1061: «MyWCFService» не содержит определения для «MyWCF» и метода расширения «MyWCF», принимающего первый аргумент типа « MyWCFService' может быть найден (вам не хватает директивы using или ссылки на сборку?)

Я считаю, что каждый раз, когда клиенты вызывают Foo, создается новый объект MyWCFService и поэтому MyEvent имеет значение null, есть ли этому объяснение?


person Pepedou    schedule 10.12.2015    source источник


Ответы (1)


События не работают в WCF так, как вы ожидаете. клиенты">Этот вопрос может вам помочь. В основном вам нужно использовать обратные вызовы вместо этого.

Изменить: поскольку вы уточнили и пытаетесь привязаться к событию не через WCF, а в другом классе на сервере/проекте WCF, вы правы в своем предположении, что каждый экземпляр созданного клиента WCF порождает новый класс и, следовательно, теряет привязка события. Я не могу обещать, что это сработает, так как я не могу проверить это в данный момент, но вы можете попробовать сделать событие «статическим», чтобы оно не создавалось с каждым новым экземпляром класса.

person Matti Price    schedule 10.12.2015
comment
Я забыл упомянуть, что событие не для клиента, AnotherClass размещается на сервере. - person Pepedou; 10.12.2015
comment
Отредактировано, чтобы, надеюсь, помочь вам. - person Matti Price; 10.12.2015
comment
Хорошо, позвольте мне попробовать, и я вернусь. - person Pepedou; 10.12.2015