2010-04-23 74 views
1

我需要在启动服务器时进行一些连接。我为这个客户端服务器应用程序使用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<ServiceMetadataBehavior>(); 
     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); 
     } 
    } 

我怎样才能启动服务器,而不必等待客户端登录,所以我可以初始化。

在此先感谢。

+0

“服务器的构造函数没有随时调用”......你在说什么构造函数? MonitoringSystemService?你的Main方法在程序启动时被调用,为什么不初始化那里的连接? – 2010-04-23 10:34:08

+0

是的,我的意思是MonitoringSystemService的cunstructor。 我需要在MonitoringSystemService中调用连接,如果我从主方法初始化,则无法访问它。 – Terry 2010-04-23 11:38:55

回答

0

WCF将根据需要实例化您的MonitoringSystemService类。在第一个客户端建立连接之前,它不会实例化它,并且如果您一次获得大量客户端连接,它将实例化几个MonitoringSystemServices来处理负载。

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

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

您获得MonitoringSystemService构造器运行时的控制,在可扩展性为代价的。您可以在Main方法中“初始化连接”,但要注意WCF可以实例化多个需要共享这些连接的MonitoringSystemServices。

+0

太棒了,我在找什么。 但是,可扩展性是什么意思? 如果我选择自己实例化的选项,是否还会有多个MonitoringSystemService实例? – Terry 2010-04-23 11:37:13

+0

如果您选择自己实例化MonitoringSystemService,那么您的程序将只创建一个您创建的实例。 ServiceHost不会再创建。如果多个客户端同时调用您的服务,则他们的请求将由WCF排队,并由您的MonitoringSystemService的单个实例逐个处理。如果您有很多客户端在同一时间连接(换句话说,它不可扩展),这可能会很慢。但是,如果您一次只能连接少量的客户端,那么这不是一个问题 - 只需要实例化自己的选项。 – 2010-04-23 13:15:44

+0

果汁,我现在正在做,它解决了我的问题。 将不会有很多客户将连接,所以对我来说不是问题:) 谢谢。 – Terry 2010-04-23 13:33:23

0

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

一个 - 你可以实现你的解决方案作为Windows服务

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

+0

在开发阶段,我使用它作为控制台应用程序,但是我打算在它完美运行后立即将其转换为服务。 – Terry 2010-04-23 10:28:49

+0

在这种情况下,我建议你在启动时编写一个虚拟客户端来调用你的服务器。 – 2010-04-23 10:57:25

相关问题