Как запустить внепроцессный экземпляр службы WCF?

Я хотел бы запустить новый экземпляр узла службы wcf из другого (UI) приложения. Мне нужно, чтобы служба была вне процесса, потому что я хочу использовать весь лимит памяти в 1,4 ГБ для 32-битного процесса .NET.

Очевидным методом является использование System.Diagnostics.Process.Start(processStartInfo), но я хотел бы выяснить, хороший это способ или нет. Я планирую объединить исполняемый файл хоста службы с приложением пользовательского интерфейса. Когда я запускаю процесс, я передам ключевые параметры службы WCF (например, порты, адреса и т. д.). Затем приложение пользовательского интерфейса (или другие приложения) подключится к этому новому процессу для взаимодействия со службой. Как только служба какое-то время не будет работать, она отключится или пользовательский интерфейс может явным образом выполнить вызов, чтобы закрыть службу.


person Luke Machowski    schedule 15.12.2009    source источник


Ответы (2)


Вы определенно можете сделать это:

  • создайте консольное приложение, в котором будет размещен ваш ServiceHost
  • сделать это консольное приложение осведомленным о наборе параметров командной строки (или настроить их в app.config консольного приложения)
  • запустите консольное приложение, используя Process.Start() из вашего пользовательского интерфейса

Я бы сказал, что это должно быть довольно легко сделать.

person marc_s    schedule 15.12.2009
comment
Большой! Спасибо за ответ. Я полагаю, что это подход, который я собираюсь использовать. Мне нужно было пройти мимо кого-то, чтобы проверить, и вы это сделали. Благодарю вас! - person Luke Machowski; 16.12.2009

Возможно, я здесь совершенно неправ, но я не думаю, что для процессов .NET существует ограничение в 1,4 ГБ памяти. Память, выделенная для каждого процесса, управляется ОС. Для 32-разрядных операционных систем доступно 4 ГБ памяти, но она используется всеми процессами. Поэтому, хотя может показаться, что доступно только 1,4 ГБ, технически это не так.

Единственная причина, по которой я говорю об этом, заключается в том, что другой способ приблизиться к этому — загрузить службу WCF в отдельный домен приложения внутри вашего приложения пользовательского интерфейса. Класс System.AppDomain можно рассматривать как легковесный процесс внутри процесса. AppDomains также можно выгрузить, когда вы закончите с ними. А поскольку WCF может пересекать границы AppDomain, а также границы процессов, это просто еще одно соображение.

Если вы не знакомы с AppDomains, подход, рекомендованный @marc_s, является самым простым. Однако, если вы ищете повод узнать о AppDomains, это отличная возможность сделать это.

person Matt Davis    schedule 15.12.2009
comment
это ограничение IIS/ASP.NET - не строго Windows как таковая - person marc_s; 15.12.2009
comment
Спасибо за понимание. Я проводил всестороннее тестирование ограничений памяти (особенно при загрузке больших файлов моделей), и определенно существует ограничение в 1,4 ГБ памяти, которую можно выделить. Сам .NET занимает оставшийся ~ 1 ГБ, что дает нам до 2,4 ГБ для 32-битного процесса. Спасибо за идею с доменом приложения. Причина, по которой я не могу использовать это, заключается в том, что он, кажется, разделяет память с остальной частью процесса. Мне нужно это, чтобы выжать все до последнего бита места для моей модели на машине 32b. Я думал, что память управляется .NET, как вы описали, но, увы, это не так! - person Luke Machowski; 16.12.2009
comment
Интересно. Спасибо, что сообщили мне (и всем остальным). - person Matt Davis; 16.12.2009