Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);
             }
         }
     }
 }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        //拼接对应的终结点的地址
        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));
                }
            }
        }
Пример #6
0
        /// <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);
                }
            }
        }