2017-02-17 4 views
1

Исходный вопрос стал излишним, потому что он был основан на неправильном предположении, поэтому он был отредактирован, чтобы предоставить некоторую информацию о Sessions, Instancing and Concurrency вместе с принятым ответом ниже.В чем разница между режимами ASP.net?

+0

Просьба уточнить. Например, вы говорите об инъекции зависимостей и контейнере IoC? который один ... и т. д. – ps2goat

+0

Эта связанная статья не содержит ни слова 'static', ни' AppDomain'. Откуда вы получаете эту информацию? –

+0

Ссылка на статью содержит описание PerCall. Тот факт, что статика изолирована, исходит из опыта. 'lock' on static reference работает в режиме« Single », но не работает в' PerCall'mode. Предположение о том, что 'AppDomain' не создано, возрастает от наблюдения за счетчиками производительности CLR. –

ответ

1

Как правило, это одинаково для разных типов хостинга: IIS, служба Windows, WCF.

Как реализуется реализация ASP.net внутри, какой механизм используется для изоляции статических переменных без создания нового AppDomain для каждого вызова службы.

Существует хорошая статья Code Project, в которой объясняются различия на высоком уровне, если вы хотите увидеть под капотом, вы должны использовать Decompiler, например ILSpy или Reflector, чтобы увидеть детали реализации. Разница в реализации будет заключаться в том, как объекты одноточечные, создаваемые или объединенные для каждого запроса или за сеанс.

Вот отрывок из статьи Код проекта: Three ways to do WCF instance management

enter image description here

enter image description here

enter image description here

Чтобы установить PerCall InstanceContext использовать ServiceBehaviour атрибута:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

Вот исходный код Service Behavior атрибута:

https://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/ServiceBehaviorAttribute.cs,b743193260862969,references

В частности, где установлен 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, чтобы узнать больше о специфике реализации.

+0

Спасибо за хороший пост. Как я сказал в комментариях выше, у нас было несколько случаев, работающих на разных машинах, и это заставило меня впасть в пятницу вечером, потому что мой мир, где статика может быть изолирована только путем создания «AppDomain», была нарушена^- ^ –