WCF服务未在服务中持久化引用类型

WCF服务未在服务中持久化引用类型,wcf,was,Wcf,Was,我在Windows 10 IIS 1511上配置了一个WAS服务。在开始实际项目之前,我创建了一个简单的测试应用程序来对所有主要问题区域进行排序。我将我的服务配置为并发多实例和单实例。我有一个并发字典来管理并发性。我使用两个不同的代理对象对服务进行了两次调用,以订阅我的观察者/主题。subscribe方法将订阅服务器添加到字典中。在第二次代理调用之后,字典中只有一个条目,我希望有两个条目。看来我的服务并没有坚持我对字典的修改。但是,如果我使用Hello操作,它只是增加一个计数器(值类型),那么第

我在Windows 10 IIS 1511上配置了一个WAS服务。在开始实际项目之前,我创建了一个简单的测试应用程序来对所有主要问题区域进行排序。我将我的服务配置为并发多实例和单实例。我有一个并发字典来管理并发性。我使用两个不同的代理对象对服务进行了两次调用,以订阅我的观察者/主题。subscribe方法将订阅服务器添加到字典中。在第二次代理调用之后,字典中只有一个条目,我希望有两个条目。看来我的服务并没有坚持我对字典的修改。但是,如果我使用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
        }
    }
这是我的服务课:

[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);
    }
}
unsubscribe类是一个扩展IDisposable的类,一旦我对远程处理(管道)进行了排序,客户端就可以取消注册自己

问:为什么字典不坚持我的观点,我补充说,但对于计数器,它却坚持

更新:

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

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

    [OperationContract(IsInitiating = true)]
    void Subscribe(PersonObserver observer);
}
[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);
        }
    }
}
这是我的无人对象:

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

    [OperationContract(IsInitiating = true)]
    void Subscribe(PersonObserver observer);
}
[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);
        }
    }
}
[DataContract(IsReference=true)]
公共类不可拆分人员:IDisposable
{
[数据成员(EmitDefaultValue=false)]
私人观察者;
[数据成员(EmitDefaultValue=false)]
私人股东;
公共非词典编纂者(ConcurrentDictionary者、PersonObserver观察者)
{
这个人=人;
this.observer=观察者;
}
公共空间处置()
{
if(observer!=null&&persons.ContainsKey(observer.Name))
{
PersonObserver person=null;
persons.TryRemove(observer.Name,out person);
}
}
}
我还将返回类型更改为值类型(返回列表的计数),并得到结果(计数为1和2)。这似乎仍然与引用类型和值类型有关?

这是令人尴尬的:)我在UnsibscribePerson类上的dispose方法被调用,这会在添加订阅服务器后立即将其删除

所以我的解决方案是不实现IDisposbale接口,这很尴尬:)我在UnsibscribePerson类上的dispose方法被调用,它在添加订阅服务器后立即删除订阅服务器

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