/// <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); }
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连接服务主机失败,请联系管理员!"); } }
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连接服务主机失败,请联系管理员!"); } }
/// <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连接服务主机失败,请联系管理员!"); } }
/// <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连接服务主机失败,请联系管理员!"); } }
/// <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; } }
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); }
/// <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); } }
/// <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连接服务主机失败,请联系管理员!"); } }
/// <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); } }