/// <summary>
        /// 发送心跳
        /// </summary>
        /// <returns></returns>
        public static bool Heartbeat()
        {
            try
            {
                bool ret = false;
                IWCFHandlerService _wcfService = AppGlobal.cache.GetData("WCFService") as IWCFHandlerService;
                using (var scope = new OperationContextScope(_wcfService as IContextChannel))
                {
                    var router = System.ServiceModel.Channels.MessageHeader.CreateHeader("routerID", myNamespace, AppGlobal.cache.GetData("routerID").ToString());
                    OperationContext.Current.OutgoingMessageHeaders.Add(router);
                    ret = _wcfService.Heartbeat(AppGlobal.cache.GetData("WCFClientID").ToString());

                    if (WcfClientManage.ServerConfigRequestState == false)
                    {
                        //重新获取服务端配置,如:是否压缩Json、是否加密Json
                        string serverConfig = _wcfService.ServerConfig();
                        WcfClientManage.IsHeartbeat      = serverConfig.Split(new char[] { '#' })[0] == "1" ? true : false;
                        WcfClientManage.HeartbeatTime    = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[1]);
                        WcfClientManage.IsMessage        = serverConfig.Split(new char[] { '#' })[2] == "1" ? true : false;
                        WcfClientManage.MessageTime      = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[3]);
                        WcfClientManage.IsCompressJson   = serverConfig.Split(new char[] { '#' })[4] == "1" ? true : false;
                        WcfClientManage.IsEncryptionJson = serverConfig.Split(new char[] { '#' })[5] == "1" ? true : false;

                        if (WcfClientManage.IsHeartbeat)
                        {
                            //开启发送心跳
                            if (timer == null)
                            {
                                StartTimer();
                            }
                            else
                            {
                                timer.Start();
                            }
                        }
                        else
                        {
                            if (timer != null)
                            {
                                timer.Stop();
                            }
                        }
                        WcfClientManage.ServerConfigRequestState = true;
                    }
                }

                if (ret == false)            //表示服务主机关闭过,丢失了clientId,必须重新创建连接
                {
                    mChannelFactory.Abort(); //关闭原来通道
                    CreateConnection(AppGlobal.cache.GetData("ClientService") as IClientService);
                }
                return(ret);
            }
            catch
            {
                WcfClientManage.ServerConfigRequestState = false;
                ReConnection(false);//连接服务主机失败,重连
                return(false);
            }
        }
Example #2
0
        private bool ServerConfigRequestState = false;                  //获取服务端配置读取状态

        /// <summary>
        /// 创建连接
        /// </summary>
        public void CreateConnection()
        {
            IWCFHandlerService wcfHandlerService = mChannelFactory.CreateChannel();

            mConn.WcfService = wcfHandlerService;
            string serverConfig = null;

            AddMessageHeader(wcfHandlerService as IContextChannel, "", (() =>
            {
                mConn.ClientID = wcfHandlerService.CreateDomain(mConn.ClientName);//创建连接获取ClientID
                if (ServerConfigRequestState == false)
                {
                    //重新获取服务端配置,如:是否压缩Json、是否加密Json
                    serverConfig = wcfHandlerService.ServerConfig();
                    ServerConfigRequestState = true;
                }
            }));

            if (!string.IsNullOrEmpty(serverConfig))
            {
                IsHeartbeat      = serverConfig.Split(new char[] { '#' })[0] == "1" ? true : false;
                HeartbeatTime    = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[1]);
                IsMessage        = serverConfig.Split(new char[] { '#' })[2] == "1" ? true : false;
                MessageTime      = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[3]);
                IsCompressJson   = serverConfig.Split(new char[] { '#' })[4] == "1" ? true : false;
                IsEncryptionJson = serverConfig.Split(new char[] { '#' })[5] == "1" ? true : false;
                serializeType    = (SerializeType)Convert.ToInt32(serverConfig.Split(new char[] { '#' })[6]);
                if (IsHeartbeat)
                {
                    //开启发送心跳
                    if (timer == null)
                    {
                        StartTimer();
                    }
                    else
                    {
                        timer.Start();
                    }
                }
                else
                {
                    if (timer != null)
                    {
                        timer.Stop();
                    }
                }
            }

            if (backConfig != null)
            {
                backConfig(IsMessage, MessageTime);
            }

            //创建连接成功后回调
            if (createconnAction != null)
            {
                createconnAction.BeginInvoke(null, null);
            }
        }
        /// <summary>
        /// 创建wcf服务连接
        /// </summary>
        /// <param name="mainfrm"></param>
        public static IWCFHandlerService CreateConnection(IClientService client)
        {
            try
            {
                //NetTcpBinding binding = new NetTcpBinding("NetTcpBinding_WCFHandlerService");
                mChannelFactory = new DuplexChannelFactory <IWCFHandlerService>(client, "myendpoint");
                IWCFHandlerService wcfHandlerService = mChannelFactory.CreateChannel();

                string routerID;
                string mProxyID;
                using (var scope = new OperationContextScope(wcfHandlerService as IContextChannel))
                {
                    // 注意namespace必须和ServiceContract中定义的namespace保持一致,默认是:http://tempuri.org
                    routerID = Guid.NewGuid().ToString();
                    var router = System.ServiceModel.Channels.MessageHeader.CreateHeader("routerID", myNamespace, routerID);
                    OperationContext.Current.OutgoingMessageHeaders.Add(router);
                    mProxyID = wcfHandlerService.CreateDomain(getLocalIPAddress());

                    if (WcfClientManage.ServerConfigRequestState == false)
                    {
                        //重新获取服务端配置,如:是否压缩Json、是否加密Json
                        string serverConfig = wcfHandlerService.ServerConfig();
                        WcfClientManage.IsHeartbeat      = serverConfig.Split(new char[] { '#' })[0] == "1" ? true : false;
                        WcfClientManage.HeartbeatTime    = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[1]);
                        WcfClientManage.IsMessage        = serverConfig.Split(new char[] { '#' })[2] == "1" ? true : false;
                        WcfClientManage.MessageTime      = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[3]);
                        WcfClientManage.IsCompressJson   = serverConfig.Split(new char[] { '#' })[4] == "1" ? true : false;
                        WcfClientManage.IsEncryptionJson = serverConfig.Split(new char[] { '#' })[5] == "1" ? true : false;

                        if (WcfClientManage.IsHeartbeat)
                        {
                            //开启发送心跳
                            if (timer == null)
                            {
                                StartTimer();
                            }
                            else
                            {
                                timer.Start();
                            }
                        }
                        else
                        {
                            if (timer != null)
                            {
                                timer.Stop();
                            }
                        }

                        WcfClientManage.ServerConfigRequestState = true;
                    }
                }


                if (AppGlobal.cache.Contains("WCFClientID"))
                {
                    AppGlobal.cache.Remove("WCFClientID");
                }
                if (AppGlobal.cache.Contains("WCFService"))
                {
                    AppGlobal.cache.Remove("WCFService");
                }
                if (AppGlobal.cache.Contains("ClientService"))
                {
                    AppGlobal.cache.Remove("ClientService");
                }
                if (AppGlobal.cache.Contains("routerID"))
                {
                    AppGlobal.cache.Remove("routerID");
                }

                AppGlobal.cache.Add("routerID", routerID);
                AppGlobal.cache.Add("WCFClientID", mProxyID);
                AppGlobal.cache.Add("WCFService", wcfHandlerService);
                AppGlobal.cache.Add("ClientService", client);

                return(wcfHandlerService);
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
        }
Example #4
0
        /// <summary>
        /// 发送心跳
        /// </summary>
        /// <returns></returns>
        private bool Heartbeat()
        {
            IWCFHandlerService _wcfService = mConn.WcfService;

            try
            {
                bool   ret          = false;
                string serverConfig = null;
                AddMessageHeader(_wcfService as IContextChannel, "", (() =>
                {
                    ret = _wcfService.Heartbeat(mConn.ClientID);
                    if (ServerConfigRequestState == false)
                    {
                        //重新获取服务端配置,如:是否压缩Json、是否加密Json
                        serverConfig = _wcfService.ServerConfig();
                        ServerConfigRequestState = true;
                    }
                }));

                if (!string.IsNullOrEmpty(serverConfig))
                {
                    IsHeartbeat      = serverConfig.Split(new char[] { '#' })[0] == "1" ? true : false;
                    HeartbeatTime    = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[1]);
                    IsMessage        = serverConfig.Split(new char[] { '#' })[2] == "1" ? true : false;
                    MessageTime      = Convert.ToInt32(serverConfig.Split(new char[] { '#' })[3]);
                    IsCompressJson   = serverConfig.Split(new char[] { '#' })[4] == "1" ? true : false;
                    IsEncryptionJson = serverConfig.Split(new char[] { '#' })[5] == "1" ? true : false;
                    serializeType    = (SerializeType)Convert.ToInt32(serverConfig.Split(new char[] { '#' })[6]);

                    if (backConfig != null)
                    {
                        backConfig(IsMessage, MessageTime);
                    }

                    if (IsHeartbeat)
                    {
                        //开启发送心跳
                        if (timer == null)
                        {
                            StartTimer();
                        }
                        else
                        {
                            timer.Start();
                        }
                    }
                    else
                    {
                        if (timer != null)
                        {
                            timer.Stop();
                        }
                    }
                }

                if (ret == false)//表示服务主机关闭过,丢失了clientId,必须重新创建连接
                {
                    //mChannelFactory.Abort();//关闭原来通道
                    (_wcfService as IContextChannel).Abort();
                    CreateConnection();
                }
                return(ret);
            }
            catch
            {
                ServerConfigRequestState = false;
                ReConnection(false);//连接服务主机失败,重连
                return(false);
            }
        }