2009-08-20 7 views
4

J'ai un processus WCF hébergé dans un service Windows. Je me demande si je peux avoir en toute sécurité plusieurs processus WCF qui font des choses différentes hébergées dans le même service Windows. Dois-je m'inquiéter des ports? J'utilise un point de terminaison mexPouvez-vous héberger plusieurs processus WCF dans un seul service Windows?

+4

Vous avez plusieurs SERVICES_ de _WCF hébergé dans un seul service Windows, et non plusieurs _processes_. –

Répondre

3

Oui, vous pouvez. Je fais exactement la même chose dans mon projet, en hébergeant trois services WCF distincts dans mon service Windows. Assurez-vous simplement que chaque point de terminaison WCF, c'est-à-dire l'adresse/le lien/le contrat, est unique.

1

Jetez un oeil à ce Run WCF ServiceHost with multiple contracts ce n'est pas exactement ce que vous demandez, mais peut-être d'une certaine utilité. En utilisant cela plus la propriété InstanceContextMode de l'attribut ServiceBehaviour et la possibilité de configurer Service throttling vous devriez pouvoir obtenir ce que vous voulez.

8

EDIT: semble si à couper mon long exemple de code/config, donc il y a une explication complète ici: http://thegrenade.blogspot.com/2009/08/hosting-multiple-wcf-services-under.html

Voici un exemple qui peut aider à vous aller:

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 }); 
    } 
} 

Et une certaine configuration

  • Ici, La configuration de comportement de liaison & est partagée entre les services, mais vous pouvez avoir besoin de différentes configurations pour différents types de services.
  • J'utilise différents ports pour différents services, mais ce n'est pas obligatoire.

    ...

Questions connexes