2015-05-19 2 views
1

Если я создал ссылку на службу с помощью Visual Studio, и следующий клиент был сгенерирован:Когда инициализируется класс обслуживания?

public partial class MyServiceClient : System.ServiceModel.ClientBase<MyType> 

Возникает вопрос: когда это сервис класс инициализируется? (Когда "новый MyService()" называется) Когда я делаю это:

MyServiceClient client = new MyServiceClient(); 

или, возможно, только здесь:

client.DoStuff()?

(Причина, почему я спрашиваю, потому что я хочу знать, как долго объект службы все еще жив до того мусора)

+0

Какой служебный объект? Сторона сервера или локальный клиентский прокси? – toadflakz

+0

@toadflakz - серверная сторона. – BornToCode

ответ

1

Это зависит от связывания я думаю. Для общих привязок (SOAP и NetTcp) клиент вообще не использует сеть до первого вызова. Это означает, что перед этим объект сервера не создается, потому что сервер не уведомляется.

Обычно лучше всего использовать PerCall instancing и иметь сервисный объект действительно дешево. Таким образом, вам не нужно вообще обдумывать эту проблему, и вам даже не нужен ответ на этот вопрос.

1

Поведение на стороне сервера контролируется перечислением InstanceContextMode, которое вы указываете как часть своего ServiceContract.

Поведение каждого варианта заключается в следующем:

  • PerCall - Instance создается для жизни вызова службы. Переработано после завершения вызова.
  • PerSession - экземпляр создается для жизни сеанса с клиентом. Перерабатывается после закрытия сеанса (или сбоя).
  • Отдельно - экземпляр создается при первом вызове конструктора ServiceHost и поддерживается на протяжении всего срока службы.

Есть некоторые дополнительные опции для изменения поведения сервера экземпляра выпуска подвергаются через свойства на MSDN : ServiceBehaviorAttribute

Edit:

ServiceHost конструктор вызывается, когда метод Open() вызывается классом клиента прокси (в данном случае MyServiceClient)

+0

Что касается экземпляраContextMode.Single: 1. Когда вызывается конструктор ServiceHost - здесь: 'MyServiceClient client = new MyServiceClient();' или здесь: 'client.DoStuff();' 2. Что такое «время жизни службы», когда размещен на IIS? до тех пор, пока не произойдет рециркуляция приложения? – BornToCode

+0

** 1. ** Конструктор 'ServiceHost' вызывается, когда клиент запрашивает услугу в первый раз во время вызова метода Open(). ** 2. ** Срок службы службы эквивалентен сроку службы приложения IIS - поэтому перезагрузка приложения, сброс IIS или завершение работы приложения. – toadflakz

+0

Благодарим вас за разъяснение относительно метода 'Open()'!Просто добавьте, что Open() вызывается только при доступе к свойству «Channel» автоматически сгенерированного прокси (свойство канала вызывает CreateChannelInternal(), которое вызывает CreateChannel(), которое вызывает base.EnsureOpened()). Это та часть, которую мне не хватает в головоломке, чтобы полностью понять ваш ответ. – BornToCode