/// <summary> /// 根据WCF接口类型上的属性,注册wcf调用配置信息 /// </summary> /// <param name="iServiceType">需要注册的类型</param> public static void RegisterTypeIfMissing(Type iServiceType) { WcfServiceAttribute cfgAtt = getWcfServiceAttribute(iServiceType); WcfClientInvokeCfgInfo cfgInfo = new WcfClientInvokeCfgInfo(cfgAtt.RelativePath, cfgAtt.CredentialFileName); RegisterTypeIfMissing(iServiceType, cfgInfo); }
/// <summary> /// 注册wcf配置调用信息 /// </summary> /// <param name="iServiceType">要注册的Wcf接口的类型</param> /// <param name="invokeCfg">wcf客户端调用配置信息</param> public static void RegisterTypeIfMissing(Type iServiceType, WcfClientInvokeCfgInfo invokeCfg) { if (!_WcfInvokeContainer.ContainsKey(iServiceType)) { lock (_SynLock) { if (!_WcfInvokeContainer.ContainsKey(iServiceType)) { _WcfInvokeContainer.Add(iServiceType, invokeCfg); } } } }
/// <summary> /// 根据指定的系统编号,直接寻找WCF客户端地址 /// </summary> /// <typeparam name="T">客户端代理实例</typeparam> /// <param name="code">系统编码</param> /// <param name="bindingCfgName">自己指定绑定的名称,如果绑定为空,则根据绑定类型和配置项来决定绑定配置</param> /// <returns>WCF接口调用类型</returns> public static WcfClientProxyScope <T> CreateWcfClientProxy <T>(string bindingCfgName) { try { Type type = typeof(T); RegisterTypeIfMissing(type); WcfClientInvokeCfgInfo wcfClientCfgInfo = _WcfInvokeContainer[type]; if (string.IsNullOrEmpty(wcfClientCfgInfo.CredentialFileNameOrServerName)) { if (MB.Util.MyNetworkCredential.CurrentSelectedServerInfo == null) { throw new MB.Util.APPException("没有设置服务的配置信息,请检查节点AppSetting/WcfServers!"); } wcfClientCfgInfo.CredentialFileNameOrServerName = MB.Util.MyNetworkCredential.CurrentSelectedServerInfo.Credential; } MB.Util.Model.WcfCredentialInfo wcfCredentialInfo = createWcfCredentialByCfgAttribute(wcfClientCfgInfo); string gzip = System.Configuration.ConfigurationManager.AppSettings[ENABLE_GZIP_MESSAGE]; bool isGZipCustomBinding = !string.IsNullOrEmpty(gzip) && string.Compare(gzip, "True", true) == 0; System.ServiceModel.Channels.Binding binding = createBinding(wcfCredentialInfo, isGZipCustomBinding, string.Empty); string uri = buildEndpointAddress(wcfCredentialInfo, wcfClientCfgInfo); System.ServiceModel.EndpointAddress address = new EndpointAddress(uri); NetworkCredential credentialInfo = null; if (!string.IsNullOrEmpty(wcfCredentialInfo.UserName) && !string.IsNullOrEmpty(wcfCredentialInfo.Password)) { credentialInfo = new NetworkCredential(wcfCredentialInfo.UserName, wcfCredentialInfo.Password, wcfCredentialInfo.Domain); } T proxy = (T)createProxyInstance <T>(binding, address, credentialInfo); //如果每个调用都需要记录的话为产生很多日志,这里特处理一下。 if (!_MyInvokeCache.ContainsKey(uri)) { _MyInvokeCache.Add(uri, uri); MB.Util.TraceEx.Write(string.Format("开始根据地址{0} 创建WCF 客户端Channel Proxy{1}", uri, typeof(T).FullName)); } WcfClientProxyScope <T> proxyScope = new WcfClientProxyScope <T>(proxy); return(proxyScope); } catch (MB.Util.APPException aex) { throw aex; } catch (Exception ex) { throw new MB.Util.APPException("创建WCF 客户端代理出错!", APPMessageType.SysErrInfo, ex); } }
/// <summary> /// 只注册wcf配置调用信息中的相对路径 /// </summary> /// <param name="iServiceType">要注册的Wcf接口的类型</param> /// <param name="relativePath">相对路径</param> public static void RegisterTypeIfMissing(Type iServiceType, string relativePath) { WcfClientInvokeCfgInfo cfgInfo = new WcfClientInvokeCfgInfo(relativePath); RegisterTypeIfMissing(iServiceType, cfgInfo); }
//拼接对应的终结点的地址 private static string buildEndpointAddress(MB.Util.Model.WcfCredentialInfo credentialInfo, WcfClientInvokeCfgInfo wcfClientCfgInfo) { string relativePath = wcfClientCfgInfo.RelativePath; string replaceDot = System.Configuration.ConfigurationManager.AppSettings[REPLACE_PATH_LAST_DOT]; //判断是否修改相对路径的地址 if ((!string.IsNullOrEmpty(replaceDot) && string.Compare(replaceDot, "True", true) == 0) || credentialInfo.ReplaceRelativePathLastDot) { relativePath = replaceRelativePath(relativePath); } if (!string.IsNullOrEmpty(credentialInfo.EndpointFormatString)) { var v = System.Text.RegularExpressions.Regex.Matches(credentialInfo.EndpointFormatString, @"\{\d\}"); if (v.Count != 1) { throw new MB.Util.APPException(string.Format(@"证书 的 EndpointFormatString:{0} 设置有误,只能设置一个参数", credentialInfo.EndpointFormatString), APPMessageType.SysErrInfo); } return(string.Format(credentialInfo.EndpointFormatString, relativePath)); } else { string formateString = System.Configuration.ConfigurationManager.AppSettings[END_POINT_ADD_FORMATE_STRING]; if (!string.IsNullOrEmpty(formateString)) { return(string.Format(formateString, getAbsoluteBassAddress(credentialInfo.BaseAddress), relativePath)); } else { WcfServiceBindingType bindingType = getBindingType(credentialInfo); string header = bindingType == WcfServiceBindingType.wsHttp ? HTTP_HEADER : NET_TCP_HEADER; string path = System.Configuration.ConfigurationManager.AppSettings[SERVICE_DOMAIN_NAME]; if (string.IsNullOrEmpty(path)) { throw new MB.Util.APPException(string.Format("app.config 需要配置程序域名称 {0}", SERVICE_DOMAIN_NAME), MB.Util.APPMessageType.SysErrInfo); } return(string.Format("{0}{1}/{2}/{3}", header, getAbsoluteBassAddress(credentialInfo.BaseAddress), path, relativePath)); } } }
/// <summary> /// 根据接口类型的配置,返回wcf的访问信息和安全信息 /// </summary> /// <param name="wcfClientCfgInfo">wcf类型的配置信息</param> /// <returns>wcf的访问信息和安全信息</returns> private static MB.Util.Model.WcfCredentialInfo createWcfCredentialByCfgAttribute(WcfClientInvokeCfgInfo wcfClientCfgInfo) { if (wcfClientCfgInfo.CredentialFileNameOrServerName.IndexOf(':') >= 0) { MB.Util.Model.WcfCredentialInfo newInfo = new MB.Util.Model.WcfCredentialInfo(); newInfo.BaseAddress = wcfClientCfgInfo.CredentialFileNameOrServerName; newInfo.HostType = MB.Util.Model.WcfServiceHostType.DEVELOPER; return(newInfo); } else { string appPath = MB.Util.General.GeApplicationDirectory(); string fileFullName = appPath + wcfClientCfgInfo.CredentialFileNameOrServerName; if (!System.IO.File.Exists(fileFullName)) { MB.Util.TraceEx.Write(string.Format("证书文件{0} 找不到", fileFullName)); throw new MB.Util.APPException("对应选择的服务器还没有注册相应的安全访问证书,请联系系统管理员", APPMessageType.DisplayToUser); } try { System.IO.StreamReader r = new System.IO.StreamReader(fileFullName); string txt = r.ReadToEnd(); r.Close(); r.Dispose(); string dStr = MB.Util.DESDataEncrypt.DecryptString(txt); MB.Util.Serializer.EntityXmlSerializer <MB.Util.Model.WcfCredentialInfo> ser = new MB.Util.Serializer.EntityXmlSerializer <MB.Util.Model.WcfCredentialInfo>(); return(ser.SingleDeSerializer(dStr, string.Empty)); } catch (Exception ex) { throw new MB.Util.APPException(string.Format("证书文件{0} 不是有效的证书!", fileFullName), APPMessageType.DisplayToUser, ex); } } }