Windows 10 IIS 1511上にWASサービスが設定されています。私は、私のアクチュアールプロジェクトを開始する前に、すべての主要な問題領域をソートするための簡単なテストアプリケーションを作成しました。私は、サービスを複数の同時実行性とインスタンスを単一性に設定しました。並行性を管理するための並行辞書があります。私はオブザーバー/サブジェクトを購読するために、2つの異なるプロキシオブジェクトを使用して2回サービスを呼び出します。 subscribeメソッドは、サブスクライバをディクショナリに追加します。 2回目のプロキシ呼び出しの後、辞書には1つの項目しかなく、私は2を期待していました。それで、私のサービスは私の変更を辞書に永続させていないようです。しかし、ちょうどカウンタ(値の種類)を増やすHello操作を使用すると、2回目の呼び出し後のカウントは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のカウント)。これは依然として参照型と値型に関連しているようです。