我需要在启动服务器时建立一些连接。我正在将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 :(得分:0)
我可以立即想到两种方式。
一个 - 您可以将解决方案实现为Windows服务
和第二 - 让虚拟客户端程序在启动时调用您的服务器。
答案 1 :(得分:0)
WCF将根据需要实例化您的MonitoringSystemService类。在第一个客户端建立连接之前,它不会实例化它,如果你同时获得大量客户端连接,它将实例化一些MonitoringSystemServices来处理负载。
您可以禁用此行为,而只使用在程序启动时创建的一个MonitoringSystemService实例。而不是告诉WCF它应该自动实例化哪种类型,你只需自己实例化并传递它:
_svc = new ServiceHost(new MonitoringSystemService()), address);
您可以控制MonitoringSystemService构造函数的运行时间,但会牺牲可伸缩性。
或者(如果您需要可伸缩性),您可以在Main方法中“初始化连接”,但要注意WCF可以实例化需要共享这些连接的多个MonitoringSystemServices。