У меня есть служба 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, есть ли этому объяснение?