Статическая переменная WCF получает сброс при каждом вызове - PullRequest
4 голосов
/ 11 марта 2010

У меня есть служба WCF, которую я звоню от нескольких клиентов. Мне нужно хранить и управлять значением во всем мире. На моем сервисе у меня есть следующие атрибуты:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]

В моем сервисе у меня что-то похожее на это:

private static int counter;

public void PrintCounter()
{
    counter++;
    StreamWriter sw = new StreamWriter(@"C:\outFile.txt", true);
    sw.WriteLine("Counter: " + counter);
    sw.Close();
}

С моим ограниченным знанием WCF я бы предположил, что у меня есть служба Singleton и тот факт, что моя личная переменная является статической, что все вызовы службы будут использовать один и тот же объект.

Однако, когда я смотрю на вывод журнала, я вижу следующее:

Counter: 1
Counter: 1

То, что я ожидал увидеть, будет:

Counter: 1
Counter: 2

Я что-то упустил, чтобы заставить работать так, как мне нужно? Нужно ли хранить объекты в каком-то кеше? Любая помощь с благодарностью.

Я могу опубликовать больше кодов, если это необходимо.

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Так как это единый сервис, например из него когда-либо будет существовать только один экземпляр, почему бы вам не сделать это обычной переменной класса?

Поскольку для параметра ConcurrencyMode также установлено значение single - вам даже не нужно беспокоиться о одновременном доступе к переменной.

С другой стороны - singleton с ConcurrencyMode = Single - это рецепт действительно очень медленного сервиса, который может быстро стать узким местом - поэтому вы можете захотеть запрограммировать свой код таким образом, чтобы он также работал при ConcurrencyMode = Multiple с потенциально одновременным доступом к переменной-члену.

0 голосов
/ 11 марта 2010

Я предполагаю, что у вас есть только один сервер, так что это не связано с балансировкой нагрузки.

Статические данные должны сохраняться, если IIS по какой-либо причине не перерабатывает приложение?

Кстати, вам действительно следует использовать Interlocked.Increment для этого, но это не должно вызывать проблему, с которой вы сталкиваетесь (если вы не находитесь под массивной нагрузкой, и вы видите такие вещи, как

10003120
10003121
10003121
10003121
10003122
...