/// <summary> /// 绑定WCF服务 /// </summary> /// <param name="objectType">对象类型</param> /// <param name="interfaceType">接口或相关类型</param> /// <param name="ipaddress">绑定IP地址</param> /// <param name="port">绑定端口</param> /// <param name="servermark">当前类型标识</param> public void StartServerBind(Type objectType, Type interfaceType, WCFManager.WCFBindingType wcftype, string ipaddress, int port, string servermark) { var serverurl = string.Format("{0}://{1}:{2}", WCFManager.GetWcfAddressMark(wcftype), ipaddress, port) + "/" + servermark; serverurl = serverurl.ToLower().Trim(); //如果已经绑定过..则直接返回 if (BindedWcfServers.ContainsKey(serverurl)) { //关闭已存在的服务 var hosttmp = BindedWcfServers[serverurl]; hosttmp.Close(); BindedWcfServers.Remove(serverurl); } ServiceHost host = new ServiceHost(objectType, new Uri(string.Format("{0}://{1}:{2}", WCFManager.GetWcfAddressMark(wcftype), ipaddress, port))); BindedWcfServers.Add(serverurl, host);//记录 host.AddServiceEndpoint(interfaceType, WCFManager.CreateBinding(wcftype), servermark); if (host.Description.Behaviors.Find <ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior metadata = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(metadata); } host.Open(); }
/// <summary> /// 绑定WCF服务 /// </summary> /// <param name="objpath">对象的文件路径</param> /// <param name="objclass">类名</param> /// <param name="interfacepath">接口或其它路径</param> /// <param name="interfacename">接口或其它类名</param> /// <param name="wcftype">WCF类型</param> /// <param name="ipaddress">IP地址</param> /// <param name="port">端口</param> /// <param name="servermark">服务标识</param> public void StartServerBind(string objpath, string objclass, string interfacepath, string interfacename, WCFManager.WCFBindingType wcftype, string ipaddress, int port, string servermark) { var objtype = DoNet.Common.Reflection.ClassHelper.GetClassType(objpath, objclass); var interfacetype = DoNet.Common.Reflection.ClassHelper.GetClassType(interfacepath, interfacename); StartServerBind(objtype, interfacetype, wcftype, ipaddress, port, servermark); }
/// <summary> /// 绑定WCF服务 /// </summary> /// <param name="objdata"></param> /// <param name="objclass"></param> /// <param name="interfacedata"></param> /// <param name="interfacename"></param> /// <param name="wcftype"></param> /// <param name="ipaddress"></param> /// <param name="port"></param> /// <param name="servermark"></param> public void StartServerBind(byte[] objdata, string objclass, string interfacename, WCFManager.WCFBindingType wcftype, string ipaddress, int port, string servermark) { var ass = System.Reflection.Assembly.Load(objdata); var objtype = ass.GetType(objclass); var interfacttype = ass.GetType(interfacename); StartServerBind(objtype, interfacttype, wcftype, ipaddress, port, servermark); }
/// <summary> /// 关闭信道 /// </summary> /// <param name="wcftype"></param> /// <param name="ip"></param> /// <param name="port"></param> /// <param name="mark"></param> public void CloseChannel(WCFManager.WCFBindingType wcftype, string ip, int port, string mark) { var url = string.Format("{0}://{1}:{2}", WCFManager.GetWcfAddressMark(wcftype), ip, port) + "/" + mark; url = url.ToLower().Trim(); if (_channelfactorys.ContainsKey(url)) { _channelfactorys[url].Close(); _channelfactorys.Remove(url); } }
/// <summary> /// 注册回调 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="wcftype"></param> /// <param name="ip"></param> /// <param name="port"></param> /// <param name="mark"></param> public void RegisterCallbackObject <T>(object instance, WCFManager.WCFBindingType wcftype, string ip, int port, string mark) { var url = string.Format("{0}://{1}:{2}", WCFManager.GetWcfAddressMark(wcftype), ip, port) + "/" + mark; url = url.ToLower().Trim(); if (_channelfactorys.ContainsKey(url)) { var channel = _channelfactorys[url] as DuplexChannelFactory <T>; var ctx = new InstanceContext(instance); var proxy = channel.CreateChannel(ctx); } }
/// <summary> /// 生成远程代理对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="wcftype"></param> /// <param name="ip"></param> /// <param name="port"></param> /// <param name="mark"></param> /// <returns></returns> public T CreateRemoteObject <T>(WCFManager.WCFBindingType wcftype, string ip, int port, string mark, TimeSpan timeout, object callback = null) { var binding = WCFManager.CreateBinding(wcftype); binding.ReceiveTimeout = timeout; var url = string.Format("{0}://{1}:{2}", WCFManager.GetWcfAddressMark(wcftype), ip, port) + "/" + mark; url = url.ToLower().Trim(); if (_channelfactorys.ContainsKey(url)) { if (_channelfactorys[url].State == CommunicationState.Opened) { try { _channelfactorys[url].Close(); } catch { } } _channelfactorys.Remove(url); _channelproxys.Remove(url); } if (callback == null) { var channelFactory = new ChannelFactory <T>(binding, url); var proxy = channelFactory.CreateChannel(); _channelfactorys.Add(url, channelFactory); _channelproxys.Add(url, proxy); return(proxy); } else { var ctx = new InstanceContext(callback); var channelFactory = new DuplexChannelFactory <T>(ctx, binding, url); var proxy = channelFactory.CreateChannel(); _channelfactorys.Add(url, channelFactory); _channelproxys.Add(url, proxy); return(proxy); } }