Статические свойства с сеансом в ASP.NET

В Интернете есть несколько сообщений об этом, но ни один из них, похоже, не дает окончательного ответа. Мой вопрос заключается в следующем. Если у меня есть статические свойства, объявленные только для получения/установки значений сеанса, являются потокобезопасными или это может вызвать проблемы? В моем приложении я добавил статические свойства в свой Global.asax, чтобы они служили своего рода центральной точкой входа для доступа к определенным значениям, например, я сохраняю текущего клиента следующим образом:

public static string CurrentClient {
    get {
      return HttpContext.Current.Session[Constants.SESSION_CURRENT_CLIENT] as string;
    }
    set {
      HttpContext.Current.Session[Constants.SESSION_CURRENT_CLIENT] = value;
    }
}

Обратите внимание, что я не устанавливаю никаких статических переменных в моем get/set, я просто ссылаюсь на текущий сеанс.

Приложение настроено так, что оно устанавливается как одно веб-приложение в IIS, но оно будет обслуживать несколько разных «экземпляров». В основном, в зависимости от того, на какой поддомен вы заходите, он затем установит все эти переменные сеанса по мере необходимости. Так, например:

client1.mydomain.com установит:

Global.CurrentClient = "client1";

client2.mydomain.com установит:

Global.CurrentClient = "client2";

Кажется, что это должно работать нормально и быть потокобезопасным, и два поддомена не будут спотыкаться друг о друга, потому что каждый из них должен иметь уникальные сеансы, но, похоже, именно это и происходит. По какой-то причине я получаю запросы к client1.mydomain.com, используя CurrentClient="client2".

Что здесь происходит, банда?


person snappymcsnap    schedule 22.06.2011    source источник


Ответы (1)


Похоже, у тебя тяжелый случай статической фобии. Не стоит слушать людей, распространяющих FUD только потому, что они не понимают, что делают.

Статические свойства по сути являются статическими методами. Они не хранят никакого состояния сами по себе. Авто-свойства, конечно, исключение, но вы, похоже, ими не пользуетесь.

Пока вы получаете доступ к любому общему состоянию в ваших статических свойствах потокобезопасным способом, у вас не будет никаких проблем.

Что происходит, когда ваши сеансы «перепутаны», вы уверены, что файл cookie сеанса установлен на правильном уровне? Если вы установите его на уровне mydomain.com, он будет общим для всех субдоменов. Кроме того, вы уверены, что вообще необходимо хранить этот материал в сеансе? Не проще ли будет просто сравнивать текущий домен со списком ваших клиентов при каждом запросе?

person Matti Virkkunen    schedule 22.06.2011
comment
Видите ли, это было именно то, что я думал, но потом я начал сомневаться в себе. Так что, вероятно, происходит то, что сеанс путается между поддоменами. Мы видим поведение при входе в два разных поддомена одновременно, кажется, что оно повреждено - person snappymcsnap; 23.06.2011