Исходный вопрос стал излишним, потому что он был основан на неправильном предположении, поэтому он был отредактирован, чтобы предоставить некоторую информацию о Sessions, Instancing and Concurrency вместе с принятым ответом ниже.В чем разница между режимами ASP.net?
ответ
Как правило, это одинаково для разных типов хостинга: IIS, служба Windows, WCF.
Как реализуется реализация ASP.net внутри, какой механизм используется для изоляции статических переменных без создания нового AppDomain для каждого вызова службы.
Существует хорошая статья Code Project, в которой объясняются различия на высоком уровне, если вы хотите увидеть под капотом, вы должны использовать Decompiler, например ILSpy или Reflector, чтобы увидеть детали реализации. Разница в реализации будет заключаться в том, как объекты одноточечные, создаваемые или объединенные для каждого запроса или за сеанс.
Вот отрывок из статьи Код проекта: Three ways to do WCF instance management
Чтобы установить PerCall InstanceContext использовать ServiceBehaviour атрибута:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
Вот исходный код Service Behavior атрибута:
В частности, где установлен instanceModeContext Поставщик:
dispatch.InstanceContextProvider = InstanceContextProviderBase.GetProviderForMode(this.instanceMode, dispatch);
if ((this.instanceMode == InstanceContextMode.Single) &&
(dispatch.SingletonInstanceContext == null))
{
if (singleton == null)
{
if (this.wellKnownSingleton != null)
{
singleton = new InstanceContext(serviceHostBase, this.wellKnownSingleton, true, false);
}
else if (this.hiddenSingleton != null)
{
singleton = new InstanceContext(serviceHostBase, this.hiddenSingleton, false, false);
}
else
{
singleton = new InstanceContext(serviceHostBase, false);
}
singleton.AutoClose = false;
}
dispatch.SingletonInstanceContext = singleton;
}
Таким образом, вы можете увидеть разницу является переключателем между wellKnownSingleton , hiddenSingleton или нет, и это реализация в том, как объекты одноточечные, создаваемые или объединенные.
Вы можете выкопать базу кода и посмотреть код channelDispatcher
, чтобы узнать больше о специфике реализации.
Спасибо за хороший пост. Как я сказал в комментариях выше, у нас было несколько случаев, работающих на разных машинах, и это заставило меня впасть в пятницу вечером, потому что мой мир, где статика может быть изолирована только путем создания «AppDomain», была нарушена^- ^ –
Просьба уточнить. Например, вы говорите об инъекции зависимостей и контейнере IoC? который один ... и т. д. – ps2goat
Эта связанная статья не содержит ни слова 'static', ни' AppDomain'. Откуда вы получаете эту информацию? –
Ссылка на статью содержит описание PerCall. Тот факт, что статика изолирована, исходит из опыта. 'lock' on static reference работает в режиме« Single », но не работает в' PerCall'mode. Предположение о том, что 'AppDomain' не создано, возрастает от наблюдения за счетчиками производительности CLR. –