WCF 服务不在服务中保留引用类型

WCF service not persisting Reference types in service

我在 Windows 10 IIS 1511 上配置了 WAS 服务。我创建了一个简单的测试应用程序,以便在开始我的实际项目之前对所有主要问题区域进行排序。我的服务配置了并发多个和实例到单个。我有一个并发字典来管理并发。我使用 2 个不同的代理对象对该服务进行了 2 次调用以订阅我的 observer/subject。 subscribe 方法将订阅者添加到字典中。在第二次代理调用之后,字典中只有一个项目,我期望有 2 个。所以我的服务似乎没有保留我对字典的更改。但是,如果我使用 Hello 操作,它只是增加一个计数器(值类型),那么在第二次调用后计数为 2。这是我的客户端控制台代码:

static void Main(string[] args)
    {
        string personErnie = "Ernie";
        string personAlvin = "James";

        //using (PersonTracker.PersonTrackerClient personTracker1 =
        //  new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint"))
        //using (PersonTracker.PersonTrackerClient personTracker2 =
        //  new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint"))
        using (PersonTracker.PersonTrackerClient personTracker1 =
            new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint"))
        using (PersonTracker.PersonTrackerClient personTracker2 =
                new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint"))
        {

            string h1 = personTracker1.Hello(personErnie); //Output: Hello Ernie, Seems like you using the http protocol, count = 1
            string h2 = personTracker1.Hello(personAlvin); //Output: Hello James, Seems like you using the http protocol, count = 2

            PersonObserver personObserverErnie = new PersonObserver(personErnie);
            object disposeObserverErnie = personTracker1.Subscribe(personObserverErnie); // Dictionary Count = 1

            PersonObserver personObserverJames = new PersonObserver(personAlvin);
            object disposeObserverJames = personTracker2.Subscribe(personObserverJames); // Dictionary Count = 1
        }
    }

这是我的服务 class:

[ServiceBehavior(
        ConcurrencyMode = ConcurrencyMode.Multiple,
        InstanceContextMode =InstanceContextMode.Single)]
public class PersonTracker : IPersonTracker
{

    public static ConcurrentDictionary<string, PersonObserver> observers = null;
    int Counter;

    public string Hello(string name)
    {
        string protocol = OperationContext.Current.Channel.LocalAddress.Uri.Scheme;
        return string.Format("Hello {0}, Seems like you using the {1} protocol, count = {2}",name, protocol,Counter++);
    }

    public UnsibscribePerson Subscribe(PersonObserver observer)
    {
        if (observers == null)
        {
            observers = new ConcurrentDictionary<string, PersonObserver>();
        }
        if (!observers.ContainsKey(observer.Name))
        {
            observers.AddOrUpdate(observer.Name, observer, (key, oldValue) => { return new PersonObserver(oldValue.Name); });
        }

        return new UnsibscribePerson(observers, observer);
    }
}

这是我的合约界面:

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IPersonTracker 
{
    [OperationContract]
    string Hello(string name);

    [OperationContract]
    UnsibscribePerson Subscribe(PersonObserver observer);
}

取消订阅 class 是一个 class 扩展 IDisposable 以便客户端在我对远程处理(管道)进行排序后自行注销。

问题:为什么字典不保留我添加的观察者,但对于计数器却保留...

更新:

因此,只需删除我的订阅操作的 return 类型中的 UnsibscribePerson 对象,我的问题就已解决,但是我需要 return 这个对象。这与我的 UnsibscribePerson 对象有关吗,这是我所做的更改和我的 UnsibscribePerson 对象:

[ServiceContract]
public interface IPersonTracker 
{
    [OperationContract]
    string Hello(string name);

    [OperationContract(IsInitiating = true)]
    void Subscribe(PersonObserver observer);
}

这是我的 UnsibscribePerson 对象:

[DataContract(IsReference = true)]
public class UnsibscribePerson : IDisposable
{
    [DataMember(EmitDefaultValue = false)]
    private PersonObserver observer;

    [DataMember(EmitDefaultValue = false)]
    private ConcurrentDictionary<string, PersonObserver> persons;

    public UnsibscribePerson(ConcurrentDictionary<string, PersonObserver> persons, PersonObserver observer)
    {
        this.persons = persons;
        this.observer = observer;
    }

    public void Dispose()
    {
        if (observer != null && persons.ContainsKey(observer.Name))
        {
            PersonObserver person = null;

            persons.TryRemove(observer.Name, out person);
        }
    }
}

我还将 return 类型更改为值类型(returning 列表的计数)并且我得到了结果(1 和 2 的计数)。这个好像还是跟引用类型和值类型有关?

这很尴尬 :) 我在 UnsibscribePerson class 上的处理方法被调用,它在添加我的订阅者后立即将其删除....

所以我的解决方案是不实现 IDisposbale 接口