Вы должны различаться между соединением и сеансом.Соединение позволяет вам звонить на сервер.Сеанс позволяет поддерживать состояние между последующими запросами от того же клиента.Например, сеанс приложения позволяет использовать кэширование на стороне сервера.Прежде всего BasicHttpBinding не поддерживает сессию.
Спецификация HTTP 1.1 описывает, что каждое соединение должно быть открыто как постоянное.Когда вы вызываете первый HTTP-запрос к новому серверу, устанавливается постоянное соединение, и оно остается открытым для последующих вызовов на тот же сервер.Если вы больше не вызываете сервер, он закрывается через некоторое время.Постоянное открытие и закрытие соединения обрабатывается внутренне, и оно полностью прозрачно для разработчиков.
Постоянные соединения используются всеми браузерами и HTTP API, включая .NET HttpWebRequest и, следовательно, все привязки на основе HTTP.Вы можете потребовать, чтобы новое соединение создавалось и закрывалось для каждого запроса / ответа, создавая пользовательскую привязку с транспортным каналом HTTP и свойством KeepAliveEnabled , установленным в false.Это добавит дополнительные издержки, поскольку для каждого запроса / ответа будет установлено новое TCP-соединение.Установление TCP-соединения является трудоемкой операцией.
Постоянное HTTP-соединение не связано с сеансом приложения WCF.Сеанс WCF по умолчанию обрабатывается между одним экземпляром прокси службы и одним экземпляром службы.Все последующие вызовы из одного и того же экземпляра прокси обрабатываются одним и тем же экземпляром службы (экземпляр PerSession).Сеанс приложения WCF построен поверх любого другого сеанса - соединение, безопасность, надежность.BasicHttpBinding не поддерживает ни один из этих типов сеансов, поэтому он не может использовать сеанс приложения WCF (и экземпляры PerSession).Каждый запрос на обслуживание, предоставляемый в BasicHttpBinding, по умолчанию обрабатывается новым экземпляром службы (экземпляром PerCall).
По спецификации HTTP клиент должен иметь возможность открывать только два одновременных постоянных соединения HTTP с одним и тем же сервером.Постоянные HTTP-соединения являются общими для всех прокси-серверов служб, вызывающих один и тот же сервер с одного и того же клиентского компьютера за один и тот же период времени.Более того, один экземпляр прокси-сервера может вызывать услугу из множества различных соединений, если между вызовами проходит длительный период времени.Это причина, по которой постоянное соединение HTTP не может использоваться в качестве сеанса связи.HTTP не ориентирован на соединение - он позволяет повторно использовать соединение только из соображений производительности.
Тайм-аут неактивности постоянного HTTP-соединения в WCF составляет 100 секунд.Я нашел это время, измеряя в Procmon.У меня без ответа вопрос о настройке этого времени ожидания на другое значение.
Когда вы используете балансировку нагрузки, вы также не можете полагаться на соединение.Постоянное соединение HTTP открывается между клиентом и балансировщиком нагрузки.Но ответственность за выбор сервера обработки лежит на алгоритме распределения нагрузки.В случае BasicHttpBinding это может быть просто Round Robin, потому что серверы обработки не будут использовать какие-либо сеансы.В случае сессионно-ориентированного связывания вы должны использовать некоторый алгоритм со сходством сессий (липкие сеансы), который будет перенаправлять все запросы из одного и того же сеанса на один и тот же сервер, чтобы один и тот же экземпляр службы мог их обработать.Но это не относится к BasicHttpBinding.