示例#1
0
        /// <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));
        }
示例#2
0
        /// <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);
        }
示例#3
0
文件: UserService.cs 项目: znw333/sod
        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);
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        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();
        }