Установка SessionMode в SessionMode.Required будет принудительно использовать привязки, которые поддерживают сеансы, такие как NetTcpBinding, WSHttpBinding и т. Д. Фактически, если вы попытаетесь использовать привязку без поддержки сеанса, среда выполнения выдаст исключение, когда вы попытаетесь открыть хостов.
Установка InstanceContextMode в PerSession означает, что только один экземпляр службы будет создан для каждой сессии, и этот экземпляр будет обслуживать все запросы, поступающие из этой сессии.
Если SessionId установлен во время выполнения, это может означать, что у вас может быть транспортный сеанс или надежный сеанс или сеанс безопасности. Их наличие не обязательно означает, что у вас есть сеанс приложения, то есть один объект службы, обслуживающий запросы для каждого прокси. Другими словами, вы можете отключить сеанс приложения, установив InstanceContextMode = PerCall, принудительно создавая новый объект службы для каждого вызова, сохраняя сеанс транспорта из-за использования netTcpBinding или сеанса надежного доступа или безопасности.
Думайте о сеансе приложения, который настроен InstanceContextMode и режимом сеанса, как сеанс более высокого уровня, полагаясь на сеанс более низкого уровня / безопасность, транспорт или надежный /. Сеанс приложения не может быть фактически установлен без наличия одного из других сеансов, отсюда требование для привязки.
Это становится немного длиннее, но для простых значений я бы рекомендовал вам передавать эти значения каждый раз вместо создания сеанса приложения. Это обеспечит короткий срок службы сервисных объектов, и на сервере не останется никаких ненужных ресурсов. Это имеет смысл с большим количеством клиентов или доверенных лиц, обращающихся к вашему сервису. И вы всегда можете кэшировать значения в клиентах, даже если хотите, передавать их как пользовательские заголовки.