【问题标题】:How can i initialise a server on startup?如何在启动时初始化服务器?
【发布时间】:2010-04-23 10:22:04
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • "服务器的构造函数在任何时候都没有被调用"...你说的是哪个构造函数?监控系统服务?您的 Main 方法在您的程序启动时被调用,为什么不在那里初始化连接?
  • 是的,我的意思是 MonitoringSystemService 的 cunstructor。我需要在MonitoringSystemService中调用连接,如果我从main方法初始化就无法访问。

标签: c# wpf wcf initialization


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 太好了,我在找什么。但是你所说的可扩展性是什么意思?如果我选择我自己实例化它的选项,是否还会有多个 MonitoringSystemService 实例?
  • 如果您选择自己实例化 MonitoringSystemService,您的程序将只有您创建的一个实例。 ServiceHost 将不再创建。如果多个客户端同时调用您的服务,他们的请求将由 WCF 排队,并由您的单个 MonitoringSystemService 实例逐一处理。如果您有很多客户端同时连接,这可能会很慢(换句话说,它不可扩展)。但是,如果您一次只有少量客户端连接,这不是问题 - 选择自己实例化选项。
  • jups,我现在正在做,它解决了我遇到的问题。不会有很多客户会连接的情况,所以对我来说不是问题:) 谢谢。
【解决方案2】:

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

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

其次 - 让一个虚拟客户端程序在启动时调用您的服务器。

【讨论】:

  • 在开发阶段,我将它用作控制台应用程序,但我打算在它完美运行后立即将其转换为服务。
  • 在这种情况下,我建议您编写一个虚拟客户端在启动时调用您的服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多