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

时间:2010-04-23 10:22:04

标签: c# wpf wcf initialization

我需要在启动服务器时建立一些连接。我正在将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);
        }
    }

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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

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

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