Служба WCF с basicHttpBinding создает новое соединение для каждого запроса? - PullRequest
4 голосов
/ 24 декабря 2010

У меня есть клиент Silverlight, вызывающий службу WCF на веб-сервере IIS.Он использует настройку по умолчанию basicHttpBinding для вызовов.В моем клиентском коде есть обычный прокси-сервер, сгенерированный Visual Studio, который генерируется при использовании параметра меню «Обновить ссылку на службу».

Все ли вызовы службы, использующие этот прокси, используют одно и то же соединение?Или он создает соединение каждый раз, когда выполняется звонок, а затем закрывает его после получения ответа?Поскольку клиент фактически выполняет вызов SOAP через HTTP, я просто предположил, что в каждом запросе на обслуживание было создано новое соединение, но я хочу проверить, так ли это?

(мне нужно знать, потому что, если он создаетновое соединение каждый раз, когда каждый запрос может закончиться на другом сервере, потому что балансировка нагрузки выполняется несколькими серверами, он использует одно соединение на время прокси, тогда я могу предположить, что все они заканчиваются на одной машине и поэтому кешируетсяинформация о состоянии для лучшей производительности.)

1 Ответ

6 голосов
/ 26 декабря 2010

Вы должны различаться между соединением и сеансом.Соединение позволяет вам звонить на сервер.Сеанс позволяет поддерживать состояние между последующими запросами от того же клиента.Например, сеанс приложения позволяет использовать кэширование на стороне сервера.Прежде всего 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...