Понимание подхода WCF Self-Hosting с использованием класса ServiceHost и его конструкторов - PullRequest
4 голосов
/ 17 мая 2011

У меня есть некоторые сомнения по поводу хостинга услуг в WCF.

Я хочу разместить службу, используя подход с самостоятельным размещением. ServiceHost класс приходит на помощь. Используя его, можно разместить службу, имеющую прямой доступ к Windows Hosting Framework. Хорошо, рассмотрим следующие подходы:

0) ОБЩИЕ ПОЛОЖЕНИЯ: Во всех случаях предполагается, что файл конфигурации App.config используется для установки ABC конечных точек. Так что в следующих кодах нет упоминания о конечной точке, просто не беспокойтесь об этом. Мы также рассмотрим эти услуги:

[ServiceContract]
public interface IMyService {
   [OperationContract]
   string MyOp1(int myint);
   [OperationContract]
   string MyOp2(int myint);
}
public class MyService : IMyService {
   // This service needs to be constructed providing at least a string or an integer, if an attempt to construct it wothout passing any of these is done, the service should raise an error.
   MyService(string strparam) { ... }
   MyService(int intparam) { ... }
   MyService(string strparam, int intparam) { ... }
   public string MyOp1(int myint) { ... }
   public string MyOp2(int myint) { ... }
}
public class MyStandaloneService : IMyService {
   // This service does not need to be constructed.
   MyStandaloneService() { ... }
   public string MyOp1(int myint) { ... }
   public string MyOp2(int myint) { ... }
}

1) СЛУЧАЙ 1: Возможно разместить службу, используя эту перегрузку класса ServiceHost:

public ServiceHost(
   Type serviceType,
   params Uri[] baseAddresses
)

Используя его, можно позволить инфраструктуре управлять созданием службы, потому что требуется просто тип службы. Конечно, строительство является основой для строительства. Конструктор без параметров будет вызван. Эта перегрузка хороша при обработке сервисов, которые не нуждаются в специальной конструкции ... какие-то автономные сервисы:

using (ServiceHost host = new ServiceHost(typeof(MyStandaloneService))) {
   host.Open();
   ...
   host.Close();
}

2) CASE 2: Возможно разместить службу, используя эту перегрузку класса ServiceHost:

public ServiceHost(
   Object singletonInstance,
   params Uri[] baseAddresses
)

Используя его, можно создать экземпляр службы и затем разместить ее, не позволяя платформе справиться с этим ... этот подход хорош при работе со службами, которые нуждаются в особом обращении и не являются полностью автономными:

MyService MS = new MyService("the string");
using (ServiceHost host = new ServiceHost(MS)) {
   host.Open();
   ...
   host.Close();
}

Ну, я хотел бы понять следующее:

A) В CASE 1 можно автоматически разместить службу, указав тип. Если я попытаюсь создать другой сервис того же типа (MyStandaloneService), это приведет к ошибке из-за попытки создать два одинаковых сервиса? Возможно, мне следует жестко закодировать, в данном случае, конфигурации конечных точек, потому что использование файла конфигурации приведет к тому, что две одинаковые службы будут размещены на одном и том же адресе.

B) В CASE 2 документация MSDN гласит, что это создает одноэлементный экземпляр службы. Поэтому, если я попытаюсь разместить другой сервис таким образом:

MyService MS = new MyService("the string");
MyService MS2 = new MyService(23);
ServiceHost host = new ServiceHost(MS));
ServiceHost host2 = new ServiceHost(MS2));
host.Open();
host2.Open();
...
host.Close();
host2.Close();

Получу ли я ошибку?

C) Если бы я хотел избежать единственного экземпляра, что мне делать?

Спасибо

Ответы [ 2 ]

8 голосов
/ 17 мая 2011

Прежде всего, вам, вероятно, нужно прочитать статью ServiceBehaviorAttribute MSDN.

Я не буду вдаваться в подробности, но вы можете создать один экземпляр объекта службы для обработки ALL запросов ( последовательно , то есть один за другим). или пусть объект ServiceHost создает один объект службы на запрос и обрабатывает их одновременно в разных потоках.

Как только вы решите, какой подход вам больше всего подходит в вашем приложении, вы поймете, какой из конструкторов ServiceHost использовать для перегрузки. Ваш CASE 1 соответствует подходу одновременной обработки нескольких экземпляров, а CASE 2 соответствует подходу "один экземпляр для обработки всех них".

Перегрузки ServiceHost должны идти рука об руку с атрибутом [ServiceBehavior] в вашем классе MyService. Поэтому, пожалуйста, проверьте ссылку, которую я дал выше.

РЕДАКТИРОВАТЬ: теперь отвечая на ваши вопросы:

A) Если я попытаюсь создать другую службу того же типа (MyStandaloneService), это приведет к ошибке из-за попытки создать две одинаковые службы?

Нет, это то, что будет делать ServiceHost: он будет создавать один экземпляр службы на запрос (на самом деле на сеанс, но снова читать MSDN )

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

Нельзя одновременно размещать две службы с одним ABC, так что да. Если вы размещаете их на разных конечных точках, это нормально. Здесь 'singleton' означает, что один единственный экземпляр службы будет обрабатывать все запросы.

C) Что мне делать, если я хочу избежать создания экземпляров синглтона?

Используйте CASE 1 подход:)

1 голос
/ 17 мая 2011

Чтобы получить конструктор не по умолчанию, вызываемый для каждого экземпляра не-одиночной службы, вы должны взглянуть на IInstanceProvider .Вы можете использовать ServiceBehaviorAttribute с InstanceContextMode = PerCall, чтобы получить новый объект службы для каждого вызова, и ваш IInstanceProvider будет использоваться для получения этого объекта, поэтому вы можете выполнять любые необходимые настройки.

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