예제 #1
0
        /// <summary>
        /// 获取所有服务插件的控制器和方法
        /// </summary>
        /// <returns></returns>
        public List <ServerManage.dwPlugin> GetWcfServicesAllInfo()
        {
            DuplexBaseServiceClient      _wcfService = clientObj.WcfService;
            List <ServerManage.dwPlugin> list        = new List <ServerManage.dwPlugin>();

            AddMessageHeader(_wcfService.InnerDuplexChannel as IContextChannel, "", (() =>
            {
                string ret = _wcfService.GetAllPluginInfo();
                list = JsonConvert.DeserializeObject <List <ServerManage.dwPlugin> >(ret);
            }));

            return(list);
        }
예제 #2
0
 public void UnSubscribe(string publishServiceName)
 {
     if (clientObj == null)
     {
         throw new Exception("还没有创建连接!");
     }
     try
     {
         DuplexBaseServiceClient _wcfService = clientObj.WcfService;
         _wcfService.UnSubscribe(clientObj.ClientID, publishServiceName);
     }
     catch (Exception e)
     {
         throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
     }
 }
예제 #3
0
 public List <ServerManage.PublishServiceObject> GetPublishServiceList()
 {
     if (clientObj == null)
     {
         throw new Exception("还没有创建连接!");
     }
     try
     {
         DuplexBaseServiceClient _wcfService = clientObj.WcfService;
         return(_wcfService.GetPublishServiceList());
     }
     catch (Exception e)
     {
         throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
     }
 }
예제 #4
0
 /// <summary>
 /// 从服务端获取变化了的缓存数据
 /// </summary>
 /// <param name="cacheIdList">缓存标识</param>
 /// <returns>缓存数据</returns>
 public List <CacheObject> GetDistributedCacheData(List <CacheIdentify> cacheIdList)
 {
     if (clientObj == null)
     {
         throw new Exception("还没有创建连接!");
     }
     try
     {
         DuplexBaseServiceClient _wcfService = clientObj.WcfService;
         return(_wcfService.GetDistributedCacheData(cacheIdList));
     }
     catch (Exception e)
     {
         throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
     }
 }
예제 #5
0
 /// <summary>
 /// 注册远程插件
 /// </summary>
 /// <param name="ServerIdentify"></param>
 /// <param name="plugin"></param>
 public void RegisterRemotePlugin(string ServerIdentify, string[] plugin)
 {
     if (clientObj == null)
     {
         throw new Exception("还没有创建连接!");
     }
     try
     {
         DuplexBaseServiceClient _wcfService = clientObj.WcfService;
         _wcfService.RegisterRemotePlugin(ServerIdentify, plugin);
     }
     catch (Exception e)
     {
         throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
     }
 }
예제 #6
0
        /// <summary>
        /// 卸载连接
        /// </summary>
        public void UnConnection()
        {
            if (clientObj == null)
            {
                return;
            }
            string mClientID = clientObj.ClientID;
            DuplexBaseServiceClient mWcfService = clientObj.WcfService;

            if (mClientID != null)
            {
                try
                {
                    AddMessageHeader(mWcfService.InnerDuplexChannel as IContextChannel, "Quit", (() =>
                    {
                        mWcfService.UnClient(mClientID);
                    }));


                    //mChannelFactory.Close();//关闭通道
                    mWcfService.Close();

                    if (timer != null)//关闭连接必须停止心跳
                    {
                        timer.Stop();
                    }
                }
                catch
                {
                    if ((mWcfService as IDisposable) != null)
                    {
                        (mWcfService as IDisposable).Dispose();
                    }
                }

                clientObj = null;
            }
        }
예제 #7
0
        private void InitComm()
        {
            if (string.IsNullOrEmpty(ClientName))
            {
                ClientName = getLocalIPAddress();
            }
            if (string.IsNullOrEmpty(PluginName))
            {
                PluginName = "SuperPlugin";
            }

            //PluginName = pluginname;

            clientObj              = new ClientObject();
            clientObj.ClientName   = ClientName;
            clientObj.RouterID     = Guid.NewGuid().ToString();
            clientObj.PluginName   = PluginName;
            clientObj.ReplyService = new ReplyDataCallback(this);

            //if (baseServiceClient == null)
            baseServiceClient = new DuplexBaseServiceClient(clientObj.ReplyService, wcfendpoint);
            //if (fileServiceClient == null)
            fileServiceClient = new FileServiceClient(fileendpoint);
        }
예제 #8
0
        /// <summary>
        /// 发送心跳
        /// </summary>
        /// <returns></returns>
        private bool Heartbeat()
        {
            DuplexBaseServiceClient _wcfService = clientObj.WcfService;

            if (_wcfService.State == CommunicationState.Closed || _wcfService.State == CommunicationState.Faulted)
            {
                ReConnection(false);//连接服务主机失败,重连
            }
            try
            {
                bool   ret          = false;
                string serverConfig = null;
                AddMessageHeader(_wcfService.InnerDuplexChannel as IContextChannel, "", (() =>
                {
                    ret = _wcfService.Heartbeat(clientObj.ClientID);
                    if (ServerConfigRequestState == false)
                    {
                        //重新获取服务端配置,如:是否压缩Json、是否加密Json
                        serverConfig = _wcfService.MiddlewareConfig();
                        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,必须重新创建连接
                {
                    _wcfService.Abort();
                    CreateConnection();
                    MiddlewareLogHelper.WriterLog(LogType.MidLog, true, Color.Red, "上级中间件已丢失客户端信息,重新创建客户端连接成功!");
                }
                return(ret);
            }
            catch (Exception err)
            {
                MiddlewareLogHelper.WriterLog(LogType.MidLog, true, Color.Red, "上级中间件失去连接!\n" + clientObj.PluginName + "\n" + err.Message);
                ServerConfigRequestState = false;
                //ReConnection(false);//连接服务主机失败,重连
                return(false);
            }
        }
예제 #9
0
        /// <summary>
        /// 向服务发送异步请求
        /// 客户端建议不要用多线程,都采用异步请求方式
        /// </summary>
        /// <param name="controller">插件名@控制器名称</param>
        /// <param name="method">方法名称</param>
        /// <param name="jsondata">数据</param>
        /// <returns>返回Json数据</returns>
        public IAsyncResult RequestAsync(string controller, string method, Action <ClientRequestData> requestAction, Action <ServiceResponseData> action)
        {
            if (clientObj == null)
            {
                throw new Exception("还没有创建连接!");
            }
            try
            {
                ClientRequestData requestData = new ClientRequestData(IsCompressJson, IsEncryptionJson, serializeType);
                if (requestAction != null)
                {
                    requestAction(requestData);
                }

                string jsondata = requestData.GetJsonData();      //获取序列化的请求数据

                if (requestData.Iscompressjson)                   //开启压缩
                {
                    jsondata = ZipComporessor.Compress(jsondata); //压缩传入参数
                }
                if (requestData.Isencryptionjson)                 //开启加密
                {
                    DESEncryptor des = new DESEncryptor();
                    des.InputString = jsondata;
                    des.DesEncrypt();
                    jsondata = des.OutString;
                }

                DuplexBaseServiceClient _wcfService = clientObj.WcfService;
                IAsyncResult            result      = null;

                AddMessageHeader(_wcfService.InnerDuplexChannel as IContextChannel, "", requestData.Iscompressjson, requestData.Isencryptionjson, requestData.Serializetype, requestData.LoginRight, (() =>
                {
                    AsyncCallback callback = delegate(IAsyncResult r)
                    {
                        string retJson = _wcfService.EndProcessRequest(r);

                        if (requestData.Isencryptionjson)//解密结果
                        {
                            DESEncryptor des = new DESEncryptor();
                            des.InputString = retJson;
                            des.DesDecrypt();
                            retJson = des.OutString;
                        }
                        if (requestData.Iscompressjson)//解压结果
                        {
                            retJson = ZipComporessor.Decompress(retJson);
                        }

                        string retData = "";
                        object Result = JsonConvert.DeserializeObject(retJson);
                        int ret = Convert.ToInt32((((Newtonsoft.Json.Linq.JObject)Result)["flag"]).ToString());
                        string msg = (((Newtonsoft.Json.Linq.JObject)Result)["msg"]).ToString();
                        if (ret == 1)
                        {
                            throw new Exception(msg);
                        }
                        else
                        {
                            retData = ((Newtonsoft.Json.Linq.JObject)(Result))["data"].ToString();
                        }

                        ServiceResponseData responsedata = new ServiceResponseData();
                        responsedata.Iscompressjson = requestData.Iscompressjson;
                        responsedata.Isencryptionjson = requestData.Isencryptionjson;
                        responsedata.Serializetype = requestData.Serializetype;
                        responsedata.SetJsonData(retData);

                        action(responsedata);
                    };
                    result = _wcfService.BeginProcessRequest(clientObj.ClientID, clientObj.PluginName, controller, method, jsondata, callback, null);
                }));

                new Action(delegate()
                {
                    if (IsHeartbeat == false)//如果没有启动心跳,则请求发送心跳
                    {
                        ServerConfigRequestState = false;
                        Heartbeat();
                    }
                }).BeginInvoke(null, null);//异步执行

                return(result);
            }
            catch (Exception e)
            {
                ServerConfigRequestState = false;
                ReConnection(true);//连接服务主机失败,重连
                throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
            }
        }
예제 #10
0
        /// <summary>
        /// 向服务发送请求
        /// </summary>
        /// <param name="controller">控制器名称</param>
        /// <param name="method">方法名称</param>
        /// <param name="requestAction">数据</param>
        /// <returns>返回Json数据</returns>
        public ServiceResponseData Request(string controller, string method, Action <ClientRequestData> requestAction)
        {
            if (clientObj == null)
            {
                throw new Exception("还没有创建连接!");
            }
            while (baseServiceClient.State == CommunicationState.Opening || clientObj.ClientID == null)//解决并发问题
            {
                Thread.Sleep(400);
            }

            if (baseServiceClient.State == CommunicationState.Closed || baseServiceClient.State == CommunicationState.Faulted)
            {
                ReConnection(true);//连接服务主机失败,重连
            }
            try
            {
                ClientRequestData requestData = new ClientRequestData(serverConfig.IsCompressJson, serverConfig.IsEncryptionJson, (SerializeType)serverConfig.SerializeType);
                if (requestAction != null)
                {
                    requestAction(requestData);
                }

                string jsondata = requestData.GetJsonData();      //获取序列化的请求数据

                if (requestData.Iscompressjson)                   //开启压缩
                {
                    jsondata = ZipComporessor.Compress(jsondata); //压缩传入参数
                }
                if (requestData.Isencryptionjson)                 //开启加密
                {
                    DESEncryptor des = new DESEncryptor();
                    des.InputString = jsondata;
                    des.DesEncrypt();
                    jsondata = des.OutString;
                }
                string retJson = "";
#if ClientProxy
                BaseServiceClient _wcfService = clientObj.WcfService;
                AddMessageHeader(_wcfService.InnerChannel as IContextChannel, "", requestData.Iscompressjson, requestData.Isencryptionjson, requestData.Serializetype, requestData.LoginRight, (() =>
                {
                    retJson = _wcfService.ProcessRequest(clientObj.ClientID, clientObj.PluginName, controller, method, jsondata);
                }));
#else
                DuplexBaseServiceClient _wcfService = clientObj.WcfService;
                AddMessageHeader(_wcfService.InnerDuplexChannel as IContextChannel, "", requestData.Iscompressjson, requestData.Isencryptionjson, requestData.Serializetype, requestData.LoginRight, (() =>
                {
                    retJson = _wcfService.ProcessRequest(clientObj.ClientID, clientObj.PluginName, controller, method, jsondata);
                }));
#endif
                if (requestData.Isencryptionjson)//解密结果
                {
                    DESEncryptor des = new DESEncryptor();
                    des.InputString = retJson;
                    des.DesDecrypt();
                    retJson = des.OutString;
                }
                if (requestData.Iscompressjson)//解压结果
                {
                    retJson = ZipComporessor.Decompress(retJson);
                }

                new Action(delegate()
                {
                    if (serverConfig.IsHeartbeat == false)//如果没有启动心跳,则请求发送心跳
                    {
                        ServerConfigRequestState = false;
                        Heartbeat();
                    }
                }).BeginInvoke(null, null);//异步执行

                string retData = "";
                object Result  = JsonConvert.DeserializeObject(retJson);
                int    ret     = Convert.ToInt32((((Newtonsoft.Json.Linq.JObject)Result)["flag"]).ToString());
                string msg     = (((Newtonsoft.Json.Linq.JObject)Result)["msg"]).ToString();
                if (ret == 1)
                {
                    throw new Exception(msg);
                }
                else
                {
                    retData = ((Newtonsoft.Json.Linq.JObject)(Result))["data"].ToString();
                }

                ServiceResponseData responsedata = new ServiceResponseData();
                responsedata.Iscompressjson   = requestData.Iscompressjson;
                responsedata.Isencryptionjson = requestData.Isencryptionjson;
                responsedata.Serializetype    = requestData.Serializetype;
                responsedata.SetJsonData(retData);

                return(responsedata);
            }
            catch (Exception e)
            {
                ServerConfigRequestState = false;
                //ReConnection(true);//连接服务主机失败,重连
                //throw new Exception(e.Message + "\n连接服务主机失败,请联系管理员!");
                throw new Exception(e.Message);
            }
        }