Время жизни экземпляра WebServiceHostFactory и WebServiceHost

#wcf #wcf-rest

#wcf #wcf-rest

Вопрос:

Я пытаюсь определить время жизни WebServiceHost. Я думал, что изначально это будет для каждого вызова / для каждого запроса (т. Е. Аналогично ASP.Net страница, создаваемая для каждого запроса). Я создал пользовательские WebServiceHostFactory и WebServiceHost, но заметил, что фабрика и хост создаются только один раз.

CustomWebServiceHostFactory переопределяет CreateServiceHost, а CustomWebServiceHost переопределяет OnOpening, чтобы выполнить некоторую диагностику для отслеживания времени жизни.

Мой служебный файл

 [ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public partial class ProductService
{
 ... // code
}
  

Мой глобальный файл.asax

 private void RegisterRoutes()
{
    RouteTable.Routes.Add(new ServiceRoute("products", new CustomServiceHostFactory(), typeof(ProductService)));
}
  

Кто-нибудь может объяснить, почему два запроса попадают в один и тот же экземпляр CustomWebServiceHost и как я буду создавать новый хост для каждого запроса на обслуживание?

Спасибо

Ответ №1:

Создание хоста для каждого нового запроса не имеет смысла — хост службы — это среда выполнения WCF на стороне сервера — фрагмент кода, который будет

  • прослушивание входящих запросов
  • отправка этих запросов классам служб, которые будут обработаны

Создание узла службы — довольно дорогостоящая и трудоемкая операция — в случае размещения в IIS это будет сделано «по требованию» при поступлении первого запроса, но узел службы останется в течение определенного времени и будет использоваться повторно.

При самостоятельном размещении вы обычно создаете один экземпляр узла службы в своем управляемом приложении, а затем оставляете этот узел открытым и активным до тех пор, пока не захотите закрыть свои службы.

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