Можете ли вы разместить несколько процессов WCF в одной службе Windows? - PullRequest
4 голосов
/ 21 августа 2009

У меня есть процесс WCF, размещенный в службе Windows. Мне интересно, могу ли я безопасно иметь несколько процессов WCF, которые делают разные вещи, размещенные в одной службе Windows. Должен ли я беспокоиться о портах? Я использую конечную точку mex

Ответы [ 4 ]

8 голосов
/ 21 августа 2009

РЕДАКТИРОВАТЬ: SO, кажется, обрезает мой длинный пример кода / конфигурации, поэтому здесь есть полное объяснение: http://thegrenade.blogspot.com/2009/08/hosting-multiple-wcf-services-under.html

Вот пример, который может вам помочь:

class Program {
    static void Main() {
        if (Environment.UserInteractive) {
            ServiceManager serviceManager = new ServiceManager();
            serviceManager.OpenAll();
            Console.ReadKey();
            serviceManager.CloseAll();
        }
        else
            ServiceBase.Run(new WindowsService());
    }
}

public class WindowsService : ServiceBase
{
    public static string WindowsServiceName = "Windows Service Name";
    public static string WindowsServiceDescription = "Windows Service Description";
    public static string WindowsServiceUsername = @".\username";
    public static string WindowsServicePassword = "password";

    private readonly ServiceManager serviceManager = new ServiceManager();

    private readonly IContainer components = new Container();

    protected override void Dispose(bool disposing) {
        if (serviceManager != null) serviceManager.CloseAll();
        if (disposing && (components != null)) components.Dispose();
        base.Dispose(disposing);
    }

    public WindowsService() {
        ServiceName = WindowsServiceName;
        CanStop = true;
    }

    protected override void OnStart(string[] args) {
        base.OnStart(args);
        serviceManager.OpenAll();
    }

    protected override void OnStop() {
        serviceManager.CloseAll();
        base.OnStop();
    }
}

public class ServiceManager {
    readonly List<ServiceHost> serviceHosts = new List<ServiceHost>();

    public void OpenAll() {
        OpenHost<Service1>();
        OpenHost<Service2>();
        ...
    }

    public void CloseAll() {
        foreach (ServiceHost serviceHost in serviceHosts)
            serviceHost.Close();
    }

    private void OpenHost<T>() {
        Type type = typeof(T);
        ServiceHost serviceHost = new ServiceHost(type);
        serviceHost.Open();
        serviceHosts.Add(serviceHost);
    }
}

/// <remarks>
/// Enables application to be installed as a Windows Service by running InstallUtil
/// </remarks>
[RunInstaller(true)]
public class WcfServiceHostInstaller : Installer {
    public WcfServiceHostInstaller() {
        Installers.Add(new ServiceInstaller
                           {
                               StartType = ServiceStartMode.Automatic,
                               ServiceName = WindowsService.WindowsServiceName,
                               Description = WindowsService.WindowsServiceDescription
                           });
        Installers.Add(new ServiceProcessInstaller { Account = ServiceAccount.User, Username = WindowsService.WindowsServiceUsername, Password = WindowsService.WindowsServicePassword });
    }
}

И некоторые настройки

  • Здесь конфигурация привязки и поведения является общей для всех сервисов, но вам могут потребоваться разные конфигурации для разных типов сервисов.
  • Я использую разные порты для разных сервисов, но вам не нужно.

    ...

3 голосов
/ 21 августа 2009

Да, вы можете. Я делаю именно это в своем проекте, размещая три отдельных сервиса WCF внутри моего сервиса Windows. Просто убедитесь, что каждая конечная точка WCF, т. Е. Кортеж адреса / привязки / контракта, уникальна.

1 голос
/ 21 августа 2009

Как и в @Matt, я тоже сделал это с помощью этой ссылки.

http://www.codeproject.com/KB/WCF/generic_wcf_host.aspx

1 голос
/ 21 августа 2009

Взгляните на это Запустите WCF ServiceHost с несколькими контрактами это не совсем то, что вы просите, но, возможно, вам пригодится.

Используя это плюс свойство InstanceContextMode атрибута ServiceBehaviour и возможность настроить Регулирование службы , вы сможете получить то, что вы хотите.

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