如何在启动时初始化服务器?

我需要在启动服务器时建立一些连接。 我正在将wcf技术用于此客户端 – 服务器应用程序。 问题是服务器的构造函数不会在任何时候被调用,所以暂时我在第一个客户端建立连接时初始化连接。 但这会在另一部分产生问题。

这是我的服务器设置:

private static ServiceHost _svc; static void Main(string[] args) { NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); Uri address = new Uri("net.tcp://localhost:8000"); _svc = new ServiceHost(typeof(MonitoringSystemService), address); publishMetaData(_svc, "http://localhost:8001"); _svc.AddServiceEndpoint(typeof(IMonitoringSystemService), binding, "Monitoring Server"); _svc.Open(); Console.WriteLine("Listener service gestart op net.tcp://localhost:8000/Monitoring"); Console.ReadLine(); } private static void publishMetaData(ServiceHost svc, string sEndpointAddress) { ServiceMetadataBehavior smb = svc.Description.Behaviors.Find(); if (smb != null) { smb.HttpGetEnabled = true; smb.HttpGetUrl = new Uri(sEndpointAddress); } else { smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.HttpGetUrl = new Uri(sEndpointAddress); svc.Description.Behaviors.Add(smb); } } 

如何在不等待客户端登录的情况下启动服务器,以便我可以初始化它。

提前致谢。

WCF将根据需要实例化您的MonitoringSystemService类。 它将不会在第一个客户端建立连接之前对其进行实例化,如果您同时获得大量客户端连接,它将实例化一些MonitoringSystemServices来处理负载。

您可以禁用此行为,而只使用在程序启动时创建的一个MonitoringSystemService实例。 而不是告诉WCF它应该自动实例化哪种类型,你只需自己实例化并传递它:

 _svc = new ServiceHost(new MonitoringSystemService()), address); 

您可以控制MonitoringSystemService构造函数的运行时间,但会牺牲可伸缩性。

或者(如果您需要可伸缩性),您可以在Main方法中“初始化连接”,但要注意WCF可以实例化需要共享这些连接的多个MonitoringSystemServices。

我有两种方法可以立即想到。

一个 – 您可以将您的解决方案实现为Windows服务

和第二 – 让一个虚拟客户端程序在启动时调用您的服务器。