2017-03-10 85 views
1

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

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); 
    } 
} 

这里是我的合同接口:

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

    [OperationContract] 
    UnsibscribePerson Subscribe(PersonObserver observer); 
} 

取消订阅类是扩展了IDisposable一类客户端在我将远程处理(管道)分类后取消注册。

问:为什么不字典坚持我的观察我加但它的反...

UPDATE:

所以才在我的订阅操作的返回删除类型UnsibscribePerson对象我已经解决了我的问题,但是我需要返回此对象。这是不是与我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); 
     } 
    } 
} 

我也改变了返回类型的值类型(返回列表的计数),我得到了结果(计数1和2)。这似乎仍然与引用类型和值类型有关?

回答

0

这是令人尴尬的:)上UnsibscribePerson类我的Dispose方法被调用它删除我的用户也加入之后....

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