/// <summary> /// 服务注册 /// </summary> /// <param name="curModel"></param> /// <returns></returns> public bool Register(ServiceRegModel curModel) { RegServiceContainer container = new RegServiceContainer(); container.CurrentContext = this.CurrentContext; return(container.RegService(curModel)); }
/// <summary> /// 执行调度 /// </summary> /// <returns></returns> public ServiceRegModel DoDispatch() { regservic.CurrentContext = this.CurrentContext; //从注册的服务列表里面,根据服务中的长连接数量决定选取那个服务 ServiceRegModel returnValue = null; ICacheProvider cache = CacheProviderFactory.GetGlobalCacheProvider(); var list = regservic.GetActiveServerList();//已经确保GetActiveServerList 不为空 //if (list != null) //{ // var regModel = list.Select(o => new { Count = cache.Get<int>(o.GetUri() + "_ListenerCount"), RegModel = o }) // .OrderBy(o => o.Count).FirstOrDefault(); // if (regModel != null) // returnValue = regModel.RegModel; //} int minCount = int.MaxValue; foreach (ServiceRegModel item in list) { ServiceHostInfo host = item as ServiceHostInfo; if (host != null && minCount > host.ListenerCount) { minCount = host.ListenerCount; returnValue = item; } } if (returnValue == null) { returnValue = this.CurrentContext.Host; } return(returnValue); }
public bool ProcessRequest(IServiceContext context) { this.currentContext = context; if (context.Request.MethodName.Substring(0, 5) == "Login") { this.User = new UserModel(); this.User.LoginName = (string)context.Request.Parameters[0]; this.User.LoginPwd = (string)context.Request.Parameters[1]; //Login2 方法为加密的登陆方法 if (context.Request.MethodName == "Login2") { this.User.LoginName = EncryptHelper.DesDecrypt(this.User.LoginName); this.User.LoginPwd = EncryptHelper.DesDecrypt(this.User.LoginPwd); } UserLoginInfoModel result = Login(); if (result.LoginResult) { //分配服务地址 DispatchService disp = new DispatchService(); disp.CurrentContext = context; ServiceRegModel server = disp.DoDispatch(); //在外网测试有问提,暂时屏蔽 2012.5.24 result.ServiceUri = server.GetUri(); //如果登录成功,设置登录凭据 ServiceIdentity newUser = new ServiceIdentity(); newUser.Id = result.User.UserID; newUser.Name = result.User.LoginName; newUser.Expire = new TimeSpan(0, 0, 20); //20秒过期,客户端必须订阅CheckUserIdentity 方法 newUser.IsAuthenticated = true; newUser.Uri = result.ServiceUri; System.Diagnostics.Debug.WriteLine("--------------newUser.Uri={0} ; Client IP:{1}", newUser.Uri, context.Request.ClientIP); ServiceAuthentication auth = new ServiceAuthentication(context); //如果相同的用户账号已经在别的机器登录过,则取消之前的登录凭据 ServiceIdentity oldUser = auth.FindIdentity(newUser); if (oldUser != null) { auth.SignOut(oldUser); } auth.Authenticate(newUser); } context.Response.WriteJsonString(result); return(false); } context.SessionRequired = true; return(true); }
/// <summary> /// 注册集群服务节点 /// </summary> /// <param name="model"></param> /// <returns></returns> public bool RegService(ServiceRegModel model) { ICacheProvider cache = base.GlobalCache; if (cache is CacheServerProvider) { //根据Key获取全局缓存中Key对应的列表 List <ServiceRegModel> curCacheList = cache.Get <List <ServiceRegModel> >("ServiceRegModels"); //如果列表为空,表明缓存不存在,当前为首次请求 if (curCacheList == null) { curCacheList = new List <ServiceRegModel>(); curCacheList.Add(model); cache.Insert <List <ServiceRegModel> >("ServiceRegModels", curCacheList); return(true); } else//若列表不为空,表明Cache存在,查找Cache中是否存在当前请求 { //若存在则返回 if (curCacheList.Exists(p => p.RegServerDesc == model.RegServerDesc)) { return(true); } else { //不存在,加入 curCacheList.Add(model); // base.GlobalCache.Remove("ServiceRegModels");Insert方法已经实现,无需Remove cache.Insert <List <ServiceRegModel> >("ServiceRegModels", curCacheList); return(true); } } } else { return(false); } }
static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); if (!System.IO.Directory.Exists(LogDirectory)) { System.IO.Directory.CreateDirectory(LogDirectory); } Console.WriteLine("log ok."); ///////////////////////////////////////////////////////////////////////// #if (MONO) if (Environment.GetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT") != "yes") { Environment.SetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT", "yes"); Console.WriteLine("设置环境变量“MONO_STRICT_MS_COMPLIANT”为Yes!"); } else { Console.WriteLine("当前环境变量“MONO_STRICT_MS_COMPLIANT”值为Yes!"); } #endif /////////////////////////////////////////////////////////////////////////// //参数获取设置的服务地址,如果没有,则保留默认的 127.0.0.1:8888 string ip = System.Configuration.ConfigurationManager.AppSettings["ServerIP"];// "127.0.0.1"; //string ip = "127.0.0.1"; IPAddress ipAddr; if (args.Length > 0 && IPAddress.TryParse(args[0], out ipAddr)) { ip = ipAddr.ToString(); } Console.WriteLine("ip config ok."); int port = int.Parse(System.Configuration.ConfigurationManager.AppSettings["ServerPort"]); // 8888; int tempPort; if (args.Length > 1 && int.TryParse(args[1], out tempPort)) { port = tempPort; } if (args.Length > 2 && args[2].ToLower() == "outlog") { EnableConsoleOut = true; } Console.WriteLine("address config ok."); //// string uri1 = string.Format("net.tcp://{0}:{1}", ip, port - 1); NetTcpBinding binding1 = new NetTcpBinding(SecurityMode.None); ServiceHost calculatorHost = new ServiceHost(typeof(CalculatorService)); calculatorHost.AddServiceEndpoint(typeof(ICalculator), binding1, uri1); calculatorHost.Opened += delegate { Console.WriteLine("The Test Service(calculator) has begun to listen"); }; calculatorHost.Open(); //// string uri = string.Format("net.tcp://{0}:{1}", ip, port); NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); //Console.WriteLine("binding init 1,ok."); binding.MaxBufferSize = int.MaxValue; //Console.WriteLine("binding init 2,ok."); binding.MaxReceivedMessageSize = int.MaxValue; //Console.WriteLine("binding init 3,ok."); #if (MONO) XmlDictionaryReaderQuotas quo = new XmlDictionaryReaderQuotas(); binding.ReaderQuotas = quo; Console.WriteLine("binding init 4_1,ok."); #endif binding.ReaderQuotas.MaxArrayLength = 65536; //Console.WriteLine("binding init 4,ok."); binding.ReaderQuotas.MaxBytesPerRead = 10 * 1024 * 1024; binding.ReaderQuotas.MaxStringContentLength = 10 * 1024 * 1024; //65536; binding.ReceiveTimeout = TimeSpan.MaxValue; //设置连接自动断开的空闲时长; binding.MaxConnections = 100; binding.ListenBacklog = 200; //Console.WriteLine("binding init 5,ok."); binding.TransferMode = TransferMode.Buffered; //Console.WriteLine("binding init 6,ok."); //请参见 http://msdn.microsoft.com/zh-cn/library/ee767642 进行设置 //Console.WriteLine("binding init ok."); ListAllBindingElements(binding); ServiceHost host = new ServiceHost(typeof(MessagePublishServiceImpl)); Console.WriteLine("service config check all ok."); host.AddServiceEndpoint(typeof(IMessagePublishService), binding, uri); Console.WriteLine("=========PDF.NET.MSF (PWMIS Message Service) Ver {0} ==", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); Console.WriteLine("启动消息发布服务……接入地址:{0}", uri); Console.WriteLine(); ChangeConsoleOut(); if (EnableConsoleOut) { ListAllBindingElements(binding); Console.WriteLine("启动消息发布服务……接入地址:{0}", uri); } Console.WriteLine("检查服务节点... ..."); ////////////////////向集群中写入节点 /////////////////////////////////////////////////////////////// //ServiceHostUri = uri; ServiceRegModel model = new ServiceRegModel(); model.RegServerIP = ip; model.RegServerPort = port; model.RegServerDesc = string.Format("Server://{0}:{1}", ip, port); model.ServerMappingIP = System.Configuration.ConfigurationManager.AppSettings["ServerMappingIP"]; Host = new ServiceHostInfo(); Host.RegServerDesc = model.RegServerDesc; Host.RegServerIP = model.RegServerIP; Host.RegServerPort = model.RegServerPort; Host.IsActive = model.IsActive; Host.ServerMappingIP = model.ServerMappingIP; RegServiceContainer container = new RegServiceContainer(); container.CurrentContext = new ServiceContext(""); if (container.RegService(model)) { Console.WriteLine("======注册集群节点成功,服务将以集群模式运行=================="); } else { Console.WriteLine("====== 未使用全局缓存,服务将以独立模式运行 =================="); } //////////////////////////////////////////////////////////////////////////////////////////////////////// MessageCenter.Instance.ListenerAdded += new EventHandler <MessageListenerEventArgs>(Instance_ListenerAdded); MessageCenter.Instance.ListenerRemoved += new EventHandler <MessageListenerEventArgs>(Instance_ListenerRemoved); MessageCenter.Instance.NotifyError += new EventHandler <MessageNotifyErrorEventArgs>(Instance_NotifyError); MessageCenter.Instance.ListenerAcceptMessage += new EventHandler <MessageListenerEventArgs>(Instance_ListenerAcceptMessage); MessageCenter.Instance.ListenerEventMessage += new EventHandler <MessageListenerEventArgs>(Instance_ListenerEventMessage); MessageCenter.Instance.ListenerRequestMessage += new EventHandler <MessageRequestEventArgs>(Instance_ListenerRequestMessage); #if (PrivateUse) if (ip.StartsWith("192.168.") || ip.StartsWith("127.0.0.1")) //测试,仅限于局域网使用 { host.Open(); Console.WriteLine("服务正在运行"); EnterMessageInputMode(); Console.WriteLine("正在关闭服务……"); host.Close(); Console.WriteLine("服务已关闭。"); } else { Console.WriteLine("服务已关闭,{0}。", UseDescrition); } #else host.Open(); Console.WriteLine("服务正在运行"); EnterMessageInputMode(); Console.WriteLine("正在关闭服务……"); host.Close(); calculatorHost.Close(); Console.WriteLine("服务已关闭。"); #endif host = null; Console.ReadLine(); }