C# 动态调用WebService及配置数据



    /// <summary>
    /// WebService 触发
    /// </summary>
    public class WebServiceHandle
    {
        //返回值 事件
        public delegate void RetValidData(Tuple<bool, object> retTuple);
        public event RetValidData EnventRetValid = null;


        /// <summary>
        /// SQL语句参数
        /// </summary>
        public OracleParameter[] Param_s { get; set; }


        /// <summary>
        /// 接口用户名
        /// </summary>
        public string UserName { get; set; }


        /// <summary>
        /// 接口密码
        /// </summary>
        public string PasswordStr { get; set; }


        /// <summary>
        /// 方法参数值
        /// 当有值时,不再处理配置的XML
        /// </summary>
        public object[] MethodArgs { get; set; }


        /// <summary>
        /// WSDL服务地址
        /// </summary>
        public string WebServiceUrl { get; set; }


        /// <summary>
        /// 方法名
        /// </summary>
        public string WebServiceMethodName { get; set; }


        /// <summary>
        /// 类名
        /// </summary>
        public string WebServiceClassName { get; set; }


        /// <summary>
        /// 模板文件路径
        /// </summary>
        public string ModelPath { get; set; }


        /// <summary>
        /// 错误的string形式 模板
        /// </summary>
        public string returnErrTypeStr { get; set; }


        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="_WebServiceUrl">WSDL服务地址</param>
        /// <param name="_WebServiceMethodName">方法名</param>
        /// <param name="_ModelPath">模板文件位置</param>
        /// <param name="_args">要发送的 参数</param>
        /// <param name="_event">方法</param>
        /// <param name="_WebServiceClassName">类名(可为空,默认第一个)</param>
        public WebServiceHandle(string _WebServiceUrl, string _WebServiceMethodName, string _ModelPath = "", object[] MethodArgs = null, OracleParameter[] _Param_s = null, RetValidData _event = null, string _WebServiceClassName = "", string _returnErrTypeStr = "")
        {
            WebServiceUrl = _WebServiceUrl;
            WebServiceMethodName = _WebServiceMethodName;
            WebServiceClassName = _WebServiceClassName;
            ModelPath = _ModelPath;
            Param_s = _Param_s;
            EnventRetValid = _event;
            returnErrTypeStr = _returnErrTypeStr;
        }


        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="ModelPath"></param>
        /// <returns>success,failure+失败原因</returns>
        public Tuple<bool, object> GetData(ref object[] retObj, XmlDocument doc = null)
        {
            retObj = null;
            //方法 参数 值
            List<object> ArrParamMeters = new List<object>();
            //if (EnventRetValid == null)
            //    throw new Exception("错误触发事件,不能为空");
            if (Param_s == null)
            {
                retObj = null;
                Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"SQL语句参数,不能为空");
                //EnventRetValid(retTuple);
                return retTuple;
            }


            if (!File.Exists(ModelPath))
            {
                retObj = null;
                Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"模板文件不存在");
                //EnventRetValid(retTuple);
                return retTuple;
            }
            if (doc == null)
            {
                doc = new XmlDocument();
                string XMLPath = System.Configuration.ConfigurationManager.AppSettings["WebServiceSettingModelPath"] ?? "\\WebServiceWSDL\\";
                int index = ModelPath.IndexOf(XMLPath);
                if (index != 0)
                {
                    ModelPath = ModelPath.Substring(index);
                }
                string LoadPath = "";
                if (HttpContext.Current == null || HttpContext.Current.Server == null)
                    LoadPath = KSWECDS.Web.Extensions.Common.GetMapPath(ModelPath);
                else
                    LoadPath = HttpContext.Current.Server.MapPath(ModelPath);


                doc.Load(LoadPath);
            }


            XmlNode xmlMethodNode = doc.SelectSingleNode("WebServiceMethods/Method[@name='" + WebServiceMethodName + "']");
            if (xmlMethodNode != null)
            {
                #region  处理方法的参数


                XmlNodeList ArrMethodParams = xmlMethodNode.SelectNodes("ParamMeters/Param");
                foreach (XmlNode ParamNode in ArrMethodParams)
                {
                    //参数 数据集存储
                    DataSet ds = new DataSet();


                    #region  获取数据集


                    XmlNodeList ArrSQLNode = ParamNode.SelectNodes("descendant::SQL");//"//SQL");


                    foreach (XmlNode item in ArrSQLNode)
                    {
                        DataTable tab = new DataTable(item.ParentNode.Attributes["name"].Value);
                        try
                        {
                            if (!string.IsNullOrEmpty(item.InnerText))
                            {
                                List<OracleParameter> _Param_s = new List<OracleParameter>();
                                foreach (OracleParameter OrPitem in Param_s)
                                {
                                    string ParamName = OrPitem.ParameterName;
                                    ParamName = ParamName.IndexOf(":") >= 0 ? ParamName : (":" + ParamName);
                                    if (item.InnerText.Contains(ParamName))
                                    {
                                        OracleParameter OrParm = OrPitem.Clone() as OracleParameter;
                                        _Param_s.Add(OrParm);
                                    }
                                }


                                DataSet dsitem = SQLDALHelper.OracleHelper.GetDataSet(CommandType.Text, item.InnerText, _Param_s.Any() ? _Param_s.ToArray() : null);
                                if (dsitem != null)
                                {
                                    if (dsitem.Tables.Count > 0)
                                    {
                                        foreach (DataTable tab1 in dsitem.Tables)
                                        {
                                            tab = tab1.Copy();
                                            tab.TableName = item.ParentNode.Attributes["name"].Value;
                                            ds.Tables.Add(tab);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                ds.Tables.Add(tab);
                            }
                        }
                        catch (Exception ex)
                        {
                            Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,获取数据失败(+" + KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex) + "+)");
                            //EnventRetValid(retTuple);
                            return retTuple;
                        }
                    }
                    if (ds.Tables.Count <= 0)
                    {
                        Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,获取数据失败");
                        //EnventRetValid(retTuple);
                        return retTuple;
                    }


                    #endregion


                    XmlNode TableNodel = ParamNode.ChildNodes[0];
                    if (TableNodel == null)
                    {
                        retObj = null;
                        Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数(Param/table)未配置");
                        //EnventRetValid(retTuple);
                        return retTuple;
                    }
                    if (TableNodel.SelectNodes("column").Count <= 0)
                    {
                        retObj = null;
                        Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数(Param/table/column)未配置");
                        //EnventRetValid(retTuple);
                        return retTuple;
                    }
                    //数据集
                    DataTable dt = ds.Tables[TableNodel.Attributes["name"].Value];


                    #region 验证 数据


                    Tuple<bool, object> _retTuple = ValidDataIsOK(ds, dt == null ? new DataRow[] { } : dt.Select(), TableNodel);
                    if (!_retTuple.Item1)
                    {
                        retObj = null;
                        //EnventRetValid(_retTuple);
                        return _retTuple;
                    }


                    #endregion


                    #region 获取数据


                    object ParamDataObj = null;
                    Tuple<bool, object> retTuple_ = GetParamData(out ParamDataObj, ds, dt == null ? new DataRow[] { } : dt.Select(), TableNodel);
                    if (!retTuple_.Item1)
                    {
                        retObj = null;
                        return retTuple_;
                    }
                    //string OutPutStr = ParamNode.Attributes["OutPut"] == null ? "" : ParamNode.Attributes["OutPut"].Value;
                    //if (OutPutStr == "XML")
                    //{
                    //    XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
                    //    xmlnsEmpty.Add("", "");


                    //    System.Xml.Serialization.XmlSerializer xmlser = new System.Xml.Serialization.XmlSerializer(ParamDataObj.GetType());
                    //    StringBuilder sb = new StringBuilder();
                    //    using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings { OmitXmlDeclaration = true }))
                    //    {
                    //        xmlser.Serialize(writer, ParamDataObj, xmlnsEmpty);
                    //    }
                    //    ArrParamMeters.Add(sb.ToString());
                    //}
                    //else
                    ArrParamMeters.Add(ParamDataObj);


                    #endregion
                }


                #endregion
            }
            else
            {
                retObj = null;
                Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,未配置");
                //EnventRetValid(retobj);
                return retTuple;
            }


            retObj = ArrParamMeters.ToArray();
            Tuple<bool, object> ret_Tuple = new Tuple<bool, object>(true, "");
            //EnventRetValid(retTuple_);
            return ret_Tuple;
        }


        /// <summary>
        /// 验证 必填数据
        /// </summary>
        /// <param name="ds">所有的数据的ds</param>
        /// <param name="dt">当前要验证的 dt</param>
        /// <param name="TableNodel">当前要验证的 Table节点</param>
        /// <returns></returns>
        private Tuple<bool, object> ValidDataIsOK(DataSet ds, DataRow[] rows, XmlNode TableNodel)
        {
            try
            {
                #region 验证 数据


                //XmlNode ParentTableNode = null;
                //if (TableNodel != null)
                //    if (TableNodel.ParentNode != null)
                //        if (TableNodel.ParentNode.ParentNode != null)
                //            ParentTableNode = TableNodel.ParentNode.ParentNode;
                //DataTable Parentdt = null;
                //if (ParentTableNode != null)
                //{
                //    if (ParentTableNode.Name == "table")
                //    {
                //        string tabName = ParentTableNode.Attributes["name"] == null ? "" : ParentTableNode.Attributes["name"].Value;
                //        if (!string.IsNullOrEmpty(tabName))
                //            Parentdt = ds.Tables[tabName];
                //    }
                //}


                //转换为 动态类
                List<dynamic> Arrdynamic = KSWECDS.Web.Extensions.Common.TableToDynamic(rows);
                XmlNodeList ArrRequiredColumnNodes = TableNodel.SelectNodes("column[@Required='true']");
                foreach (XmlNode RequiredColumnNode in ArrRequiredColumnNodes)
                {
                    string field = RequiredColumnNode.Attributes["localname"] == null ? "" : RequiredColumnNode.Attributes["localname"].Value;
                    string fielddesc = RequiredColumnNode.Attributes["localdesc"] == null ? "" : RequiredColumnNode.Attributes["localdesc"].Value;
                    string fieldErrMsgStr = (string.IsNullOrEmpty(fielddesc) ? "" : (fielddesc + "-")) + field;
                    string fieldType = RequiredColumnNode.Attributes["dataType"] == null ? "" : RequiredColumnNode.Attributes["dataType"].Value;


                    if (fieldType == "[]" || fieldType == "{}")
                    {
                        var ChildTabNode = RequiredColumnNode.SelectSingleNode("table");
                        if (ChildTabNode != null)
                        {
                            string fieldTabName = ChildTabNode.Attributes["name"] == null ? "" : ChildTabNode.Attributes["name"].Value;
                            string fieldTabNameDesc = ChildTabNode.Attributes["desc"] == null ? "" : ChildTabNode.Attributes["desc"].Value;
                            string fieldTabNameErrMsgStr = (string.IsNullOrEmpty(fieldTabNameDesc) ? "" : (fieldTabNameDesc + "-")) + fieldTabName;
                            if (!string.IsNullOrEmpty(fieldTabName))
                            {
                                DataTable childdt = ds.Tables[fieldTabName];
                                if (childdt != null)
                                {
                                    if (childdt.Rows.Count > 0)
                                    {
                                        #region 主表字表 关联关系语句 并验证数据


                                        string SeltSqlStr = "";
                                        string parentrefrenceKey = ChildTabNode.Attributes["parentrefrenceKey"] == null ? "" : ChildTabNode.Attributes["parentrefrenceKey"].Value;
                                        string refrenceKey = ChildTabNode.Attributes["refrenceKey"] == null ? "" : ChildTabNode.Attributes["refrenceKey"].Value;


                                        if (!string.IsNullOrEmpty(parentrefrenceKey) && !string.IsNullOrEmpty(refrenceKey))
                                        {
                                            string[] ArrPfreKeys = parentrefrenceKey.Split(',');
                                            string[] ArrfreKeys = refrenceKey.Split(',');
                                            #region 数据与上级有关联性 则关联后再验证
                                            if (rows.Any())
                                            {
                                                foreach (DataRow dr in rows)
                                                {
                                                    for (int i = 0; i < ArrPfreKeys.Length; i++)
                                                    {
                                                        string str = ArrPfreKeys[i];
                                                        if (SeltSqlStr == "")
                                                        {
                                                            if (ArrfreKeys.Length > i && dr[str] != null)
                                                                SeltSqlStr = ArrfreKeys[i] + " = " + dr[str];
                                                        }
                                                        else
                                                        {
                                                            if (ArrfreKeys.Length > i && dr[str] != null)
                                                                SeltSqlStr += " and" + ArrfreKeys[i] + " = " + dr[str];
                                                        }
                                                    }




                                                    //获取 关联的数据
                                                    DataRow[] ChilddataRows = null;
                                                    ChilddataRows = childdt.Select(SeltSqlStr);
                                                    if (ChilddataRows != null)
                                                    {
                                                        if (ChilddataRows.Count() <= 0)
                                                        {
                                                            Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                                            return retobj;
                                                        }
                                                        else
                                                        {
                                                            Tuple<bool, object> retobj = ValidDataIsOK(ds, ChilddataRows, ChildTabNode);
                                                            if (!retobj.Item1)
                                                                return retobj;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                                        return retobj;
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,且与上级数据有关联,但上级数据为空,这是不允许的");
                                                return retobj;
                                            }
                                            #endregion
                                        }
                                        else
                                        {
                                            #region 数据与上级mei有关联性 则验证本身


                                            //获取 关联的数据
                                            DataRow[] ChilddataRows = null;
                                            ChilddataRows = childdt.Select();
                                            if (ChilddataRows != null)
                                            {
                                                if (ChilddataRows.Count() <= 0)
                                                {
                                                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                                    return retobj;
                                                }
                                                else
                                                {
                                                    Tuple<bool, object> retobj = ValidDataIsOK(ds, ChilddataRows, ChildTabNode);
                                                    if (!retobj.Item1)
                                                        return retobj;
                                                }
                                            }
                                            else
                                            {
                                                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                                return retobj;
                                            }


                                            #endregion
                                        }


                                        #endregion
                                    }
                                    else
                                    {
                                        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                        return retobj;
                                    }
                                }
                                else
                                {
                                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabNameErrMsgStr + ")是必填字段,不能为空");
                                    return retobj;
                                }
                            }
                            else
                            {
                                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,找不到必填字段字段(" + fieldTabNameErrMsgStr + ")");
                                return retobj;
                            }
                        }
                        else
                        {
                            Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,找不到必填字段字段(" + fieldErrMsgStr + ")");
                            return retobj;
                        }
                    }
                    else
                    {
                        if (rows.Any())
                        {
                            var WhereArrdynamic = Arrdynamic.Where(x => ((IDictionary<string, object>)x).Any(n => n.Key.ToLower() == field.ToLower()));//&& ((string)n.Value == null || (string)n.Value == ""))
                            if (WhereArrdynamic.Any())
                            {
                                if (WhereArrdynamic.Any(x => ((IDictionary<string, object>)x).Any(n => n.Key.ToLower() == field.ToLower() && string.IsNullOrEmpty((string)Convert.ChangeType(n.Value, typeof(string))))))
                                {
                                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldErrMsgStr + ")是必填字段,不能为空");
                                    return retobj;
                                }
                            }
                            else
                            {
                                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,找不到必填字段字段(" + fieldErrMsgStr + ")");
                                return retobj;
                            }
                        }
                        else
                        {
                            Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldErrMsgStr + ")是必填字段,不能为空");
                            return retobj;
                        }
                    }
                }


                #endregion


                Tuple<bool, object> _retobj = new Tuple<bool, object>(true, (object)"");
                return _retobj;
            }
            catch (Exception ex)
            {
                Tuple<bool, object> exretTuple = new Tuple<bool, object>(false, KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex));
                return exretTuple;
            }
        }


        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="ParamObjData">存放参数节点数据</param>
        /// <param name="ds">当前参数节点的所有数据集合</param>
        /// <param name="rows">当前table节点数据</param>
        /// <param name="TableNode">当前table节点</param>
        /// <returns></returns>
        private Tuple<bool, object> GetParamData(out object ParamObjData, DataSet ds, DataRow[] rows, XmlNode TableNode)
        {
            try
            {
                ParamObjData = null;
                if (TableNode == null)
                {
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数 table节点不存在");
                    return retobj;
                }
                string tabName = TableNode.Attributes["name"] == null ? "" : TableNode.Attributes["name"].Value;
                if (TableNode.ParentNode == null)
                {
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数 " + tabName + "上级节点不存在");
                    return retobj;
                }
                string dataType = TableNode.ParentNode.Attributes["dataType"] == null ? "" : TableNode.ParentNode.Attributes["dataType"].Value;
                //转换成string
                List<string> ArrStrColumnValue = new List<string>() { "decimal", "double", "float" };


                if (dataType == "[]")
                {
                    #region 数组


                    //记录数据
                    List<object> ArrParamObj = new List<object>();


                    //string SeltSqlStr = "";
                    //string parentrefrenceKey = TableNode.Attributes["parentrefrenceKey"] == null ? "" : TableNode.Attributes["parentrefrenceKey"].Value;
                    //string refrenceKey = TableNode.Attributes["refrenceKey"] == null ? "" : TableNode.Attributes["refrenceKey"].Value;


                    //if (!string.IsNullOrEmpty(parentrefrenceKey) && !string.IsNullOrEmpty(refrenceKey))
                    //{
                    //    string[] ArrPfreKeys = parentrefrenceKey.Split(',');
                    //    string[] ArrfreKeys = refrenceKey.Split(',');
                    //    #region 数据与上级有关联性 则关联后再验证
                    //    if (rows.Any())
                    //    {
                    //        foreach (DataRow dr in rows)
                    //        {
                    //            for (int i = 0; i < ArrPfreKeys.Length; i++)
                    //            {
                    //                string str = ArrPfreKeys[i];
                    //                if (SeltSqlStr == "")
                    //                {
                    //                    if (ArrfreKeys.Length > i && dr[str] != null)
                    //                        SeltSqlStr = ArrfreKeys[i] + " = " + dr[str];
                    //                }
                    //                else
                    //                {
                    //                    if (ArrfreKeys.Length > i && dr[str] != null)
                    //                        SeltSqlStr += " and" + ArrfreKeys[i] + " = " + dr[str];
                    //                }
                    //            }


                    //            //获取 关联的数据
                    //            DataRow[] ChilddataRows = null;
                    //            ChilddataRows = childdt.Select(SeltSqlStr);
                    //            if (ChilddataRows != null)
                    //            {
                    //                if (ChilddataRows.Count() <= 0)
                    //                {
                    //                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabName + ")是必填字段,不能为空");
                    //                    return retobj;
                    //                }
                    //                else
                    //                {
                    //                    Tuple<bool, object> retobj = ValidDataIsOK(ds, ChilddataRows, ChildTabNode);
                    //                    if (!retobj.Item1)
                    //                        return retobj;
                    //                }
                    //            }
                    //            else
                    //            {
                    //                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabName + ")是必填字段,不能为空");
                    //                return retobj;
                    //            }
                    //        }
                    //    }
                    //    else
                    //    {
                    //        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,字段(" + fieldTabName + ")是必填字段,且与上级数据有关联,但上级数据为空,这是不允许的");
                    //        return retobj;
                    //    }
                    //    #endregion
                    //}
                    //else
                    //{
                    //}


                    #region 数据与上级没有关联性 则验证本身


                    if (rows.Any())
                    {
                        foreach (DataRow dr in rows)
                        {
                            dynamic dynamicObj = new System.Dynamic.ExpandoObject();
                            var dymic = (IDictionary<string, object>)dynamicObj;
                            XmlNodeList ArrColumnNodes = TableNode.SelectNodes("column");
                            foreach (XmlNode ColumnNode in ArrColumnNodes)
                            {
                                string ColumnNodename = ColumnNode.Attributes["name"] == null ? null : ColumnNode.Attributes["name"].Value;
                                string ColumnNodelocalname = ColumnNode.Attributes["localname"] == null ? null : ColumnNode.Attributes["localname"].Value;
                                string ColumnNodedataType = ColumnNode.Attributes["dataType"] == null ? null : ColumnNode.Attributes["dataType"].Value;


                                #region  设置动态数据


                                if (ColumnNodedataType != null)
                                {
                                    if (ColumnNodedataType.ToLower() == "[]" || ColumnNodedataType.ToLower() == "{}")
                                    {
                                        dymic[ColumnNodename] = null;


                                        #region 对象或 数组


                                        var ChildTableNode = ColumnNode.SelectSingleNode("table");
                                        if (ChildTableNode != null)
                                        {
                                            string ChildTableNodename = ChildTableNode.Attributes["name"] == null ? null : ChildTableNode.Attributes["name"].Value;
                                            //子的table
                                            DataTable dtChildTable = ds.Tables[ChildTableNodename];
                                            if (dtChildTable != null)
                                            {
                                                string ChildTabSeltSqlStr = "";
                                                string ChildTabparentrefrenceKey = ChildTableNode.Attributes["parentrefrenceKey"] == null ? "" : ChildTableNode.Attributes["parentrefrenceKey"].Value;
                                                string ChildTabrefrenceKey = ChildTableNode.Attributes["refrenceKey"] == null ? "" : ChildTableNode.Attributes["refrenceKey"].Value;


                                                #region 设置关联关系


                                                if (!string.IsNullOrEmpty(ChildTabparentrefrenceKey) && !string.IsNullOrEmpty(ChildTabrefrenceKey))
                                                {
                                                    string[] ArrChildTabPfreKeys = ChildTabparentrefrenceKey.Split(',');
                                                    string[] ArrChildTabfreKeys = ChildTabrefrenceKey.Split(',');


                                                    for (int i = 0; i < ArrChildTabPfreKeys.Length; i++)
                                                    {
                                                        string str = ArrChildTabPfreKeys[i];
                                                        if (ChildTabSeltSqlStr == "")
                                                        {
                                                            if (ArrChildTabfreKeys.Length > i && dr[str] != null)
                                                                ChildTabSeltSqlStr = ArrChildTabfreKeys[i] + " = '" + dr[str] + "'";
                                                        }
                                                        else
                                                        {
                                                            if (ArrChildTabfreKeys.Length > i && dr[str] != null)
                                                                ChildTabSeltSqlStr += " and" + ArrChildTabfreKeys[i] + " = '" + dr[str] + "'";
                                                        }
                                                    }
                                                }


                                                #endregion


                                                DataRow[] ChildTableRows = dtChildTable.Select(ChildTabSeltSqlStr);
                                                object ColumnObj = null;
                                                Tuple<bool, object> retTuplt = GetParamData(out ColumnObj, ds, ChildTableRows, ChildTableNode);
                                                if (!retTuplt.Item1)
                                                {
                                                    ParamObjData = null;
                                                    return retTuplt;
                                                }
                                                dymic[ColumnNodename] = ColumnObj;
                                            }
                                        }


                                        #endregion
                                    }
                                    else
                                    {
                                        if (ArrStrColumnValue.Any(x => x == ColumnNodedataType.ToLower()))
                                        {
                                            decimal decimalVal = 0;
                                            string StrValue = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname].ToString() : "";
                                            if (decimal.TryParse(StrValue, out decimalVal))
                                                dymic[ColumnNodename] = decimalVal.ToString("#0.#########");
                                            else
                                                dymic[ColumnNodename] = StrValue;
                                        }
                                        else
                                        {
                                            dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname] : "";
                                        }
                                    }
                                }
                                else
                                {
                                    if (ArrStrColumnValue.Any(x => x == ColumnNodedataType.ToLower()))
                                    {
                                        dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname].ToString() : "";
                                    }
                                    else
                                    {
                                        dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname] : "";
                                    }
                                }


                                #endregion
                            }
                            ArrParamObj.Add(dynamicObj);
                        }
                    }
                    else
                    {
                        dynamic dynamicObj = new System.Dynamic.ExpandoObject();
                        var dymic = (IDictionary<string, object>)dynamicObj;
                        XmlNodeList ArrColumnNodes = TableNode.SelectNodes("column");
                        foreach (XmlNode ColumnNode in ArrColumnNodes)
                        {
                            string ColumnNodename = ColumnNode.Attributes["name"] == null ? null : ColumnNode.Attributes["name"].Value;
                            string ColumnNodelocalname = ColumnNode.Attributes["localname"] == null ? null : ColumnNode.Attributes["localname"].Value;
                            string ColumnNodedataType = ColumnNode.Attributes["dataType"] == null ? null : ColumnNode.Attributes["dataType"].Value;


                            #region  设置动态数据


                            if (ColumnNodedataType != null)
                            {
                                if (ColumnNodedataType.ToLower() == "[]" || ColumnNodedataType.ToLower() == "{}")
                                {
                                    dymic[ColumnNodename] = null;


                                    #region 对象或 数组


                                    var ChildTableNode = ColumnNode.SelectSingleNode("table");
                                    if (ChildTableNode != null)
                                    {
                                        string ChildTableNodename = ChildTableNode.Attributes["name"] == null ? null : ChildTableNode.Attributes["name"].Value;
                                        //子的table
                                        DataTable dtChildTable = ds.Tables[ChildTableNodename];
                                        if (dtChildTable != null)
                                        {
                                            string ChildTabSeltSqlStr = "";
                                            string ChildTabparentrefrenceKey = ChildTableNode.Attributes["parentrefrenceKey"] == null ? "" : ChildTableNode.Attributes["parentrefrenceKey"].Value;
                                            string ChildTabrefrenceKey = ChildTableNode.Attributes["refrenceKey"] == null ? "" : ChildTableNode.Attributes["refrenceKey"].Value;
                                            if (!string.IsNullOrEmpty(ChildTabparentrefrenceKey) || !string.IsNullOrEmpty(ChildTabrefrenceKey))
                                            {
                                                ParamObjData = null;
                                                Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数的子表与主表有关联,但上级数据为空,这是不允许的");
                                                //EnventRetValid(retTuple);
                                                return retTuple;
                                            }
                                            DataRow[] ChildTableRows = dtChildTable.Select(ChildTabSeltSqlStr);
                                            object ColumnObj = null;
                                            Tuple<bool, object> retTuplt = GetParamData(out ColumnObj, ds, ChildTableRows, ChildTableNode);
                                            if (!retTuplt.Item1)
                                            {
                                                ParamObjData = null;
                                                return retTuplt;
                                            }
                                            dymic[ColumnNodename] = ColumnObj;
                                        }
                                    }


                                    #endregion
                                }
                                else
                                {
                                    dymic[ColumnNodename] = "";
                                }
                            }
                            else
                            {
                                dymic[ColumnNodename] = "";
                            }


                            #endregion
                        }
                        ArrParamObj.Add(dynamicObj);
                    }


                    #endregion


                    ParamObjData = ArrParamObj;


                    #endregion
                }
                else if (dataType == "{}")
                {
                    #region 对象


                    dynamic dynamicObj = new System.Dynamic.ExpandoObject();
                    var dymic = (IDictionary<string, object>)dynamicObj;


                    if (rows.Any())
                    {
                        DataRow dr = rows[0];
                        XmlNodeList ArrColumnNodes = TableNode.SelectNodes("column");
                        foreach (XmlNode ColumnNode in ArrColumnNodes)
                        {
                            string ColumnNodename = ColumnNode.Attributes["name"] == null ? null : ColumnNode.Attributes["name"].Value;
                            string ColumnNodelocalname = ColumnNode.Attributes["localname"] == null ? null : ColumnNode.Attributes["localname"].Value;
                            string ColumnNodedataType = ColumnNode.Attributes["dataType"] == null ? null : ColumnNode.Attributes["dataType"].Value;


                            #region  设置动态数据


                            if (ColumnNodedataType != null)
                            {
                                if (ColumnNodedataType.ToLower() == "[]" || ColumnNodedataType.ToLower() == "{}")
                                {
                                    dymic[ColumnNodename] = null;


                                    #region 对象或 数组


                                    var ChildTableNode = ColumnNode.SelectSingleNode("table");
                                    if (ChildTableNode != null)
                                    {
                                        string ChildTableNodename = ChildTableNode.Attributes["name"] == null ? null : ChildTableNode.Attributes["name"].Value;
                                        //子的table
                                        DataTable dtChildTable = ds.Tables[ChildTableNodename];
                                        if (dtChildTable != null)
                                        {
                                            string ChildTabSeltSqlStr = "";
                                            string ChildTabparentrefrenceKey = ChildTableNode.Attributes["parentrefrenceKey"] == null ? "" : ChildTableNode.Attributes["parentrefrenceKey"].Value;
                                            string ChildTabrefrenceKey = ChildTableNode.Attributes["refrenceKey"] == null ? "" : ChildTableNode.Attributes["refrenceKey"].Value;


                                            #region 设置关联关系


                                            if (!string.IsNullOrEmpty(ChildTabparentrefrenceKey) && !string.IsNullOrEmpty(ChildTabrefrenceKey))
                                            {
                                                string[] ArrChildTabPfreKeys = ChildTabparentrefrenceKey.Split(',');
                                                string[] ArrChildTabfreKeys = ChildTabrefrenceKey.Split(',');


                                                for (int i = 0; i < ArrChildTabPfreKeys.Length; i++)
                                                {
                                                    string str = ArrChildTabPfreKeys[i];
                                                    if (ChildTabSeltSqlStr == "")
                                                    {
                                                        if (ArrChildTabfreKeys.Length > i && dr[str] != null)
                                                            ChildTabSeltSqlStr = ArrChildTabfreKeys[i] + " = '" + dr[str] + "'";
                                                    }
                                                    else
                                                    {
                                                        if (ArrChildTabfreKeys.Length > i && dr[str] != null)
                                                            ChildTabSeltSqlStr += " and" + ArrChildTabfreKeys[i] + " = '" + dr[str] + "'";
                                                    }
                                                }
                                            }


                                            #endregion


                                            DataRow[] ChildTableRows = dtChildTable.Select(ChildTabSeltSqlStr);
                                            object ColumnObj = null;
                                            Tuple<bool, object> retTuplt = GetParamData(out ColumnObj, ds, ChildTableRows, ChildTableNode);
                                            if (!retTuplt.Item1)
                                            {
                                                ParamObjData = null;
                                                return retTuplt;
                                            }
                                            dymic[ColumnNodename] = ColumnObj;
                                        }
                                    }


                                    #endregion
                                }
                                else
                                {
                                    if (ArrStrColumnValue.Any(x => x == ColumnNodedataType.ToLower()))
                                    {
                                        decimal decimalVal = 0;
                                        string StrValue = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname].ToString() : "";
                                        if (decimal.TryParse(StrValue, out decimalVal))
                                            dymic[ColumnNodename] = decimalVal.ToString("#0.#########");
                                        else
                                            dymic[ColumnNodename] = StrValue;
                                    }
                                    else
                                    {
                                        dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname] : "";
                                    }
                                }
                            }
                            else
                            {
                                if (ArrStrColumnValue.Any(x => x == ColumnNodedataType.ToLower()))
                                {
                                    dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname].ToString() : "";
                                }
                                else
                                {
                                    dymic[ColumnNodename] = dr.Table.Columns.Contains(ColumnNodelocalname) ? dr[ColumnNodelocalname] : "";
                                }
                            }


                            #endregion
                        }
                    }
                    else
                    {
                        XmlNodeList ArrColumnNodes = TableNode.SelectNodes("column");
                        foreach (XmlNode ColumnNode in ArrColumnNodes)
                        {
                            string ColumnNodename = ColumnNode.Attributes["name"] == null ? null : ColumnNode.Attributes["name"].Value;
                            string ColumnNodelocalname = ColumnNode.Attributes["localname"] == null ? null : ColumnNode.Attributes["localname"].Value;
                            string ColumnNodedataType = ColumnNode.Attributes["dataType"] == null ? null : ColumnNode.Attributes["dataType"].Value;


                            #region  设置动态数据


                            if (ColumnNodedataType != null)
                            {
                                if (ColumnNodedataType.ToLower() == "[]" || ColumnNodedataType.ToLower() == "{}")
                                {
                                    dymic[ColumnNodename] = null;


                                    #region 对象或 数组


                                    var ChildTableNode = ColumnNode.SelectSingleNode("table");
                                    if (ChildTableNode != null)
                                    {
                                        string ChildTableNodename = ChildTableNode.Attributes["name"] == null ? null : ChildTableNode.Attributes["name"].Value;
                                        //子的table
                                        DataTable dtChildTable = ds.Tables[ChildTableNodename];
                                        if (dtChildTable != null)
                                        {
                                            string ChildTabSeltSqlStr = "";
                                            string ChildTabparentrefrenceKey = ChildTableNode.Attributes["parentrefrenceKey"] == null ? "" : ChildTableNode.Attributes["parentrefrenceKey"].Value;
                                            string ChildTabrefrenceKey = ChildTableNode.Attributes["refrenceKey"] == null ? "" : ChildTableNode.Attributes["refrenceKey"].Value;
                                            if (!string.IsNullOrEmpty(ChildTabparentrefrenceKey) || !string.IsNullOrEmpty(ChildTabrefrenceKey))
                                            {
                                                ParamObjData = null;
                                                Tuple<bool, object> retTuple = new Tuple<bool, object>(false, (object)"WebService模板" + WebServiceMethodName + "方法,参数的子表与主表有关联,但上级数据为空,这是不允许的");
                                                //EnventRetValid(retTuple);
                                                return retTuple;
                                            }
                                            DataRow[] ChildTableRows = dtChildTable.Select(ChildTabSeltSqlStr);
                                            object ColumnObj = null;
                                            Tuple<bool, object> retTuplt = GetParamData(out ColumnObj, ds, ChildTableRows, ChildTableNode);
                                            if (!retTuplt.Item1)
                                            {
                                                ParamObjData = null;
                                                return retTuplt;
                                            }
                                            dymic[ColumnNodename] = ColumnObj;
                                        }
                                    }


                                    #endregion
                                }
                                else
                                {
                                    dymic[ColumnNodename] = "";
                                }
                            }
                            else
                            {
                                dymic[ColumnNodename] = "";
                            }


                            #endregion
                        }
                    }


                    ParamObjData = dynamicObj;


                    #endregion
                }
                else
                {
                    #region 字段


                    object obj = null;
                    if (rows != null)
                    {
                        if (rows.Any())
                        {
                            DataRow dr = rows[0];
                            XmlNode ColumnNode = TableNode.SelectSingleNode("column");
                            if (ColumnNode != null)
                            {
                                string columnlocalname = ColumnNode.Attributes["localname"] == null ? "" : ColumnNode.Attributes["localname"].Value;
                                if (!string.IsNullOrEmpty(columnlocalname))
                                    obj = dr[columnlocalname];
                            }
                        }
                    }
                    ParamObjData = obj;


                    #endregion
                }


                Tuple<bool, object> _retobj = new Tuple<bool, object>(true, (object)"");
                return _retobj;
            }
            catch (Exception ex)
            {
                ParamObjData = null;
                Tuple<bool, object> exretTuple = new Tuple<bool, object>(false, KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex));
                return exretTuple;
            }
        }


        /// <summary>
        /// 执行WebService方法
        /// 错误信息和成功信息,都在委托方法中执行
        /// </summary>
        public void StartWebService(XmlDocument doc = null)
        {
            try
            {
                object[] args = null;
                if (MethodArgs != null)
                    args = MethodArgs;
                else
                {
                    Tuple<bool, object> _retTupleobj = GetData(ref args, doc);
                    if (!_retTupleobj.Item1)
                    {
                        if (EnventRetValid != null)
                            EnventRetValid(_retTupleobj);
                        return;
                    }
                }


                #region 一个方法 多种数据配置时


                string WebServiceMethodNameStr = WebServiceMethodName;
                XmlNode xmlMethodNode = doc.SelectSingleNode("WebServiceMethods/Method[@name='" + WebServiceMethodName + "']");
                if (xmlMethodNode != null)
                {
                    //一个方法 多种数据配置时
                    if (xmlMethodNode.Attributes["MethodName"] != null)
                    {
                        WebServiceMethodNameStr = xmlMethodNode.Attributes["MethodName"].Value;
                    }
                }


                #endregion


                //Tuple<bool, object> retTupleobj = WebServiceHelper.InvokeWebServiceInMemeory(WebServiceUrl, WebServiceMethodName, args, UserName, PasswordStr, "", returnErrTypeStr);
                Tuple<bool, object> retTupleobj = WebServiceHelper.InvokeWebServiceOutPutDLL(WebServiceUrl, WebServiceMethodNameStr, args, ModelPath, Param_s, UserName, PasswordStr, "", returnErrTypeStr);
                if (!string.IsNullOrEmpty(returnErrTypeStr))
                {
                    string retStr = retTupleobj.Item2.ToString();
                    if (retStr.Replace(" ", "").IndexOf(returnErrTypeStr.Replace("'", "\"")) >= 0 || retStr.Replace(" ", "").IndexOf(returnErrTypeStr.Replace("\"", "'")) >= 0)
                    {
                        retTupleobj = new Tuple<bool, object>(false, retStr);
                        try
                        {
                            SQLDALHelper.WriteLogHelper.WriteLog(retStr, "ServiceLog\\ErrorReturn", true, false);
                        }
                        catch (Exception ex)
                        {


                        }
                    }
                }
                if (EnventRetValid != null)
                    EnventRetValid(retTupleobj);
            }
            catch (Exception ex)
            {
                string ErrMsg = KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex);
                Tuple<bool, object> _retTupleobj = new Tuple<bool, object>(false, ErrMsg);
                if (EnventRetValid != null)
                    EnventRetValid(_retTupleobj);
                return;
            }
        }
    }


    /// <summary>
    /// 动态生成 WebService dll
    /// </summary>
    public static class WebServiceHelper
    {
        //EntityFrameWork
        public static WebdbContext appContext = new WebdbContext();
        public static Repository.Pattern.Ef6.UnitOfWork unitOfWork_ = new Repository.Pattern.Ef6.UnitOfWork(appContext);


        //是否 保留发送报文
        private static string StrWriteServiceLog = System.Configuration.ConfigurationManager.AppSettings["IsWriteServiceLog"] ?? "1";
        //保留发送报文目录
        private static string ServiceLogAddress = System.Configuration.ConfigurationManager.AppSettings["ServiceLogAddress"] ?? "ServiceLog";


        / <summary>
        / 动态WebService的类型
        / </summary>
        //private static Type WebServiceType { get; set; }


        / <summary>
        / 动态WebService的类名
        / </summary>
        //private static string ServiceClassName { get; set; }


        /// < summary>          
        /// 动态调用web服务 
        /// < /summary>          
        /// < param name="url">WSDL服务地址< /param>
        /// < param name="classname">类名< /param>  
        /// < param name="methodname">方法名< /param>  
        /// < param name="args">参数< /param> 
        /// < returns>< /returns>
        private static object InvokeWebService(string url, string classname, string methodname, object[] args, OracleParameter[] Param_s, string _ModelPath, string UserName = "", string PasswordStr = "")
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = GetWsClassName(url);
            }
            try
            {
                string XMLPath = System.Configuration.ConfigurationManager.AppSettings["WebServiceSettingModelPath"] ?? "\\WebServiceWSDL\\";
                if (_ModelPath.IndexOf(".") > 0)
                    _ModelPath = _ModelPath.Substring(0, _ModelPath.LastIndexOf("\\"));
                if (_ModelPath.IndexOf(":") <= 0)
                {
                    if (_ModelPath.IndexOf(XMLPath) < 0)
                        XMLPath = XMLPath + _ModelPath;
                    if (HttpContext.Current == null || HttpContext.Current.Server == null)
                        _ModelPath = KSWECDS.Web.Extensions.Common.GetMapPath(XMLPath);
                    else
                        _ModelPath = HttpContext.Current.Server.MapPath(XMLPath);
                }


                //获取WSDL   
                WebClient wc = new WebClient();
                if (!string.IsNullOrEmpty(UserName))
                    wc.Credentials = new NetworkCredential(UserName, PasswordStr);
                Stream stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);//创建和格式化 WSDL 文档文件。
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//创建客户端代理类。
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(@namespace);
                //生成客户端代理类代码          
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                CSharpCodeProvider icc = new CSharpCodeProvider();//用于创建和检索代码生成器和代码编译器的实例
                //设定编译参数                 
                CompilerParameters cplist = new CompilerParameters();
                cplist.GenerateExecutable = false;
                cplist.GenerateInMemory = true;
                cplist.ReferencedAssemblies.Add("System.dll");
                cplist.ReferencedAssemblies.Add("System.XML.dll");
                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                cplist.ReferencedAssemblies.Add("System.Data.dll");
                //编译代理类                 
                CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                if (true == cr.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    throw new Exception(sb.ToString());
                }
                //生成代理实例,并调用方法   
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type WebServiceType = assembly.GetType(@namespace + "." + classname, true, true);
                object obj = Activator.CreateInstance(WebServiceType);//创建实例
                MethodInfo[] ServiceMethods = WebServiceType.GetMethods();
                System.Reflection.MethodInfo mi = ServiceMethods.Where(x => x.Name.ToLower() == methodname.ToLower()).FirstOrDefault();
                if (mi != null)
                {
                    ParameterInfo[] Parameters = mi.GetParameters();
                    return mi.Invoke(obj, args);
                }
                else
                    return null;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }


        /// <summary>
        /// 获取WebService 类名
        /// </summary>
        /// <param name="wsUrl"></param>
        /// <returns></returns>
        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');
            return pps[0];
        }


        /// </summary>  
        /// 根据指定的信息,调用远程WebService方法  
        /// </summary>  
        /// <param name="url">WebService的http形式的地址</param>  
        /// <param name="nameSpace">欲调用的WebService的命名空间</param>  
        /// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>  
        /// <param name="methodname">欲调用的WebService的方法名</param>  
        /// <param name="args">参数列表</param>  
        /// <returns>WebService的执行结果</returns>  
        private static Tuple<bool, object> InvokeWebServiceInMemeory(string url, string methodname, object[] args, OracleParameter[] Param_s, string _ModelPath, string UserName = "", string PasswordStr = "", string classname = "", string nameSpace = "WECDSWebService.DynamicWebCalling", string retErrTypeStr = "")
        {
            try
            {
                string XMLPath = System.Configuration.ConfigurationManager.AppSettings["WebServiceSettingModelPath"] ?? "\\WebServiceWSDL\\";
                if (_ModelPath.IndexOf(".") > 0)
                    _ModelPath = _ModelPath.Substring(0, _ModelPath.LastIndexOf("\\"));
                if (_ModelPath.IndexOf(":") <= 0)
                {
                    if (_ModelPath.IndexOf(XMLPath) < 0)
                        XMLPath = XMLPath + _ModelPath;
                    if (HttpContext.Current == null || HttpContext.Current.Server == null)
                        _ModelPath = KSWECDS.Web.Extensions.Common.GetMapPath(XMLPath);
                    else
                        _ModelPath = HttpContext.Current.Server.MapPath(XMLPath);
                }


                //1.使用WebClient 下载WSDL信息
                WebClient wc = new WebClient();
                if (!string.IsNullOrEmpty(UserName))
                    wc.Credentials = new NetworkCredential(UserName, PasswordStr);
                Stream stream = wc.OpenRead(url);
                //2.创建和格式化WSDL文档
                ServiceDescription srvDesc = ServiceDescription.Read(stream);
                List<System.Web.Services.Description.Service> ArrServices = new List<System.Web.Services.Description.Service>();
                foreach (System.Web.Services.Description.Service item in srvDesc.Services)
                {
                    ArrServices.Add(item);
                }
                if (ArrServices.Any())
                {
                    var WhereArrServices = ArrServices.Where(x => x.Name.ToLower() == classname);
                    if (!WhereArrServices.Any())
                        classname = ArrServices.FirstOrDefault().Name;
                }
                else
                {
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"服务不存在");
                    return retobj;
                }
                //3. 创建客户端代理代理类
                ServiceDescriptionImporter srvDescInporter = new ServiceDescriptionImporter();
                srvDescInporter.ProtocolName = "Soap";//指定访问协议
                srvDescInporter.Style = ServiceDescriptionImportStyle.Client;//生成客户端代理,默认。
                srvDescInporter.AddServiceDescription(srvDesc, "", ""); //添加WSDL文档。
                //4 .使用 CodeDom 编译客户端代理类。
                CodeNamespace codeNamespce = new CodeNamespace(nameSpace);
                CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
                codeCompileUnit.Namespaces.Add(codeNamespce);
                srvDescInporter.Import(codeNamespce, codeCompileUnit);
                //代码生成器
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                //表示用于调用编译器的参数。
                System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                parameter.GenerateExecutable = false;   //设置是否生成可执行文件。
                parameter.GenerateInMemory = true;      //设置是否在内存中生成输出。
                //parameter.OutputAssembly = HttpContext.Current.Server.MapPath("/" + classname) + "/WebServiceDynamic.dll"; // 可以指定你所需的任何文件名。  
                parameter.ReferencedAssemblies.Add("System.dll");   //ReferencedAssemblies  获取当前项目所引用的程序集。
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");


                //获取从编译器返回的编译结果。
                System.CodeDom.Compiler.CompilerResults cr = provider.CompileAssemblyFromDom(parameter, codeCompileUnit);
                if (true == cr.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    //throw new Exception(sb.ToString());
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)sb.ToString());
                    return retobj;
                }
                //已程编译序集的零时路径
                string pathAssenbly = cr.PathToAssembly;
                //获取已编译的程序集,然后通过反射进行动态调用。
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type WebServiceType = assembly.GetType(nameSpace + "." + classname, true, true); // 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
                if (WebServiceType != null)
                {
                    object obj = Activator.CreateInstance(WebServiceType);//创建实例
                    var WebServiceProtitys = obj.GetType().GetProperties();
                    var WhereCredentials = WebServiceProtitys.Where(x => x.Name.IndexOf("Credentials") >= 0);
                    if (WhereCredentials.Any())
                    {
                        if (!string.IsNullOrEmpty(UserName))
                        {
                            WhereCredentials.FirstOrDefault().SetValue(obj, new NetworkCredential(UserName, PasswordStr));
                        }
                    }
                    MethodInfo[] ServiceMethods = WebServiceType.GetMethods();//获取所有方法
                    System.Reflection.MethodInfo mi = ServiceMethods.Where(x => x.Name.ToLower() == methodname.ToLower()).FirstOrDefault(); //获取指定方法
                    if (mi != null)
                    {
                        List<object> MethodObj = new List<object>();
                        if (args != null)
                        {
                            ParameterInfo[] Parameters = mi.GetParameters();//获取所有参数
                            for (int i = 0; i < Parameters.Length; i++)
                            {
                                if (args.Length > i)
                                {
                                    ParameterInfo itemMethodParm = Parameters[i];
                                    Type MethodParmType = itemMethodParm.ParameterType;
                                    if (MethodParmType.GetInterface("IEnumerable", false) != null &&
                                        (MethodParmType.Name.ToLower().IndexOf("string") < 0 ||
                                        (MethodParmType.Name.ToLower().IndexOf("string") >= 0 &&
                                        (MethodParmType.Name.ToLower().IndexOf("[]") > 0 || MethodParmType.Name.ToLower().IndexOf("<") > 0))))
                                    {
                                        //是List数组还是Array数组
                                        bool IsList = true;


                                        #region  创建List<T> 实例 并赋值 不管是否是 Array数组 都先实例化 List数组


                                        Type ListTType = null;//泛型类
                                        var IEnumerableTypes = MethodParmType.GetGenericArguments();
                                        if (IEnumerableTypes.Any())
                                        {
                                            //List<> 数组
                                            ListTType = IEnumerableTypes[0];
                                        }
                                        else
                                        {
                                            //数组
                                            ListTType = null;//数组类型
                                            ListTType = assembly.GetType(MethodParmType.FullName.Replace("[]", ""));
                                            IsList = false;
                                        }
                                        if (ListTType != null)
                                        {
                                            Type ListType = typeof(List<>);
                                            ListType = ListType.MakeGenericType(ListTType);
                                            //创建List<T> 数组 实例
                                            var ObjListT = Activator.CreateInstance(ListType);
                                            //List数组的Add方法
                                            MethodInfo AddMethodInfo = ListType.GetMethod("Add");
                                            if (AddMethodInfo != null)
                                            {
                                                Type argsType = args[i].GetType();
                                                if (argsType.GetInterface("IEnumerable", false) != null &&
                                                (argsType.Name.ToLower().IndexOf("string") < 0 ||
                                                (argsType.Name.ToLower().IndexOf("string") >= 0 &&
                                                (argsType.Name.ToLower().IndexOf("[]") > 0 || argsType.Name.ToLower().IndexOf("<") > 0))))
                                                {
                                                    var ArrIEnumerable = args[i] as System.Collections.IEnumerable;
                                                    foreach (var itemIE in ArrIEnumerable)
                                                    {
                                                        //转换类型 并相同字段赋值
                                                        var ListitemObj = SetSamaProtity(ListTType, itemIE, assembly, true);
                                                        //执行 List数组的Add方法
                                                        AddMethodInfo.Invoke(ObjListT, new object[] { ListitemObj });
                                                    }
                                                    if (IsList)
                                                    {
                                                        MethodObj.Add(ObjListT);
                                                    }
                                                    else
                                                    {
                                                        MethodInfo ToArrayMethodInfo = ListType.GetMethod("ToArray");
                                                        if (ToArrayMethodInfo != null)
                                                        {
                                                            var ArrObj = ToArrayMethodInfo.Invoke(ObjListT, null);
                                                            MethodObj.Add(ArrObj);
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"参数类型不匹配");
                                                    return retobj;
                                                }
                                            }
                                        }


                                        #endregion
                                    }
                                    else
                                    {
                                        MethodObj.Add(SetSamaProtity(MethodParmType, args[i], assembly, true));
                                    }
                                }
                                else
                                    MethodObj.Add(null);
                            }
                        }
                        else
                        {
                            MethodObj = new List<object>();
                        }


                        bool IsWriteServiceLog = false;//是否保留报文
                        if (StrWriteServiceLog == "1")
                        {
                            IsWriteServiceLog = true;
                        }
                        else if (StrWriteServiceLog == "是")
                        {
                            IsWriteServiceLog = true;
                        }
                        else if (StrWriteServiceLog.ToLower() == "true")
                        {
                            IsWriteServiceLog = true;
                        }


                        string LabelStr = methodname + "(" + url + ")";
                        //报文
                        string MethodParamJsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(MethodObj);
                        if (IsWriteServiceLog)
                        {
                            SQLDALHelper.WriteLogHelper.WriteLog(MethodParamJsonObj, ServiceLogAddress, true, false, LabelStr);
                        }


                        var _Methodretobj = mi.Invoke(obj, MethodObj.ToArray());
                        string MethodretobjStr = "";
                        if (_Methodretobj != null)
                        {
                            if (!_Methodretobj.GetType().Equals(typeof(System.String)))
                                MethodretobjStr = Newtonsoft.Json.JsonConvert.SerializeObject(_Methodretobj);
                            else
                                MethodretobjStr = _Methodretobj.ToString();
                        }


                        if (MethodretobjStr.Contains("锁定"))
                        {
                            WebdbContext AppContxt = new WebdbContext();
                            TMLockJson OTMLockJson = new TMLockJson();
                            OTMLockJson.IsUnLock = false;
                            OTMLockJson.JsonStr = MethodParamJsonObj;
                            OTMLockJson.LockKey = "锁定";
                            OTMLockJson.Url = url;
                            OTMLockJson.MethodName = methodname;
                            OTMLockJson.UserName = UserName;
                            OTMLockJson.PasswordStr = PasswordStr;
                            OTMLockJson.retErrTypeStr = retErrTypeStr;
                            var dbSet = AppContxt.TMLockJson.Attach(OTMLockJson);
                            dbSet.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added;
                            AppContxt.Entry(OTMLockJson).State = System.Data.Entity.EntityState.Added;
                            AppContxt.SaveChanges();
                        }


                        var Methodretobj = mi.Invoke(obj, MethodObj.ToArray());
                        Tuple<bool, object> _retobj = new Tuple<bool, object>(true, Methodretobj);
                        return _retobj;
                    }
                    else
                    {
                        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"要执行的方法不存在");
                        return retobj;
                    }
                }
                else
                {
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"找不到可执行的WebService服务类Type");
                    return retobj;
                }
            }
            catch (Exception ex)
            {
                //throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex));
                return retobj;
            }
        }


        /// <summary>
        /// 设置相同属性值
        /// </summary>
        /// <typeparam name="SetType">要设置的类型 Type</typeparam>
        /// <typeparam name="GetobjModel">获取相同值的 数据</typeparam>
        /// <param name="IngoreFieldCase">是否区分大小写</param>
        /// <returns></returns>
        public static object SetSamaProtity(Type SetType, Object GetobjModel, System.Reflection.Assembly assembly, bool IngoreFieldCase = false)
        {
            #region 赋值相同项


            object SetobjModel = null;
            if (SetType != null)
            {
                SetobjModel = Activator.CreateInstance(SetType);
            }
            else
                return null;


            System.Reflection.PropertyInfo[] Set_PropertyInfos = SetobjModel == null ? new System.Reflection.PropertyInfo[] { } : SetobjModel.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
            System.Reflection.PropertyInfo[] Get_PropertyInfos = new System.Reflection.PropertyInfo[] { };
            Type Get_Type = GetobjModel.GetType();
            bool IsDynamic = false;
            if (Get_Type.FullName.IndexOf("Dynamic") > 0)
            {
                IsDynamic = true;
            }
            else
            {
                if (GetobjModel != null)
                {
                    Get_PropertyInfos = GetobjModel.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
                }
                else
                {
                    return null;
                }
            }


            if (!Set_PropertyInfos.Any())
            {
                System.Reflection.FieldInfo[] Set_FieldInfos = SetobjModel == null ? new System.Reflection.FieldInfo[] { } : SetobjModel.GetType().GetFields().Where(x => x.MemberType == MemberTypes.Field).ToArray();
                //遍历该model实体的所有字段
                foreach (System.Reflection.FieldInfo fi in Set_FieldInfos)
                {
                    //设置值
                    var SetObjVal = fi.GetValue(SetobjModel);
                    string DataType = fi.FieldType.Name;
                    //获取值
                    object GetObjVal = null;
                    if (IsDynamic)
                    {
                        var WhereGetfi_s = ((IDictionary<string, object>)GetobjModel).Where(x => IngoreFieldCase ? (x.Key.ToUpper() == fi.Name.ToUpper()) : x.Key == fi.Name);
                        if (WhereGetfi_s.Any())
                        {
                            var Getfi = WhereGetfi_s.First();
                            GetObjVal = Getfi.Value;
                        }
                    }
                    else
                    {
                        var WhereGetfi_s = Get_PropertyInfos.Where(x => IngoreFieldCase ? (x.Name.ToUpper() == fi.Name.ToUpper()) : x.Name == fi.Name);
                        if (WhereGetfi_s.Any())
                        {
                            var Getfi = WhereGetfi_s.First();
                            GetObjVal = Getfi.GetValue(GetobjModel);
                        }
                    }
                    if (GetObjVal == null)
                        continue;
                    //泛型
                    if (fi.FieldType.IsGenericType && fi.FieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                        //泛型 类型
                        var Arguments = fi.FieldType.GetGenericArguments();
                        Type ChildType = Arguments[0].GetType();
                    }
                    //判断是否派生自IEnumerable(string 是特殊的数组)
                    else //if (fi.FieldType.GetInterface("IEnumerable", false) != null && DataType.ToLower().IndexOf("string") < 0)
                        if (fi.FieldType.GetInterface("IEnumerable", false) != null &&
                        (fi.FieldType.Name.ToLower().IndexOf("string") < 0 ||
                        (fi.FieldType.Name.ToLower().IndexOf("string") >= 0 &&
                        (fi.FieldType.Name.ToLower().IndexOf("[]") > 0 || fi.FieldType.Name.ToLower().IndexOf("<") > 0))))
                        {
                            var Arrobjval = GetObjVal as System.Collections.IEnumerable;


                            //是List数组还是Array数组
                            bool IsList = true;


                            #region  创建List<T> 实例 并赋值


                            Type ListTType = null;//泛型类
                            var IEnumerableTypes = fi.FieldType.GetGenericArguments();
                            if (IEnumerableTypes.Any())
                            {
                                //List<> 数组
                                ListTType = IEnumerableTypes[0];
                            }
                            else
                            {
                                //数组
                                ListTType = null;//数组类型
                                ListTType = assembly.GetType(fi.FieldType.FullName.Replace("[]", ""));
                                IsList = false;
                            }


                            Type ListType = typeof(List<>);
                            ListType = ListType.MakeGenericType(ListTType);
                            //创建List数组实例
                            var ObjListT = Activator.CreateInstance(ListType);
                            Type argsType = GetObjVal.GetType();
                            //if (argsType.GetInterface("IEnumerable", false) != null && (argsType.Name.ToLower().IndexOf("string") < 0 && argsType.Name.ToLower().IndexOf("[]") < 0 && argsType.Name.ToLower().IndexOf("<") < 0))
                            if (argsType.GetInterface("IEnumerable", false) != null &&
                            (argsType.Name.ToLower().IndexOf("string") < 0 ||
                            (argsType.Name.ToLower().IndexOf("string") >= 0 &&
                            (argsType.Name.ToLower().IndexOf("[]") > 0 || argsType.Name.ToLower().IndexOf("<") > 0))))
                            {
                                MethodInfo AddMethodInfo = ListType.GetMethod("Add");
                                if (AddMethodInfo != null)
                                {
                                    foreach (var item in Arrobjval)
                                    {
                                        var obj = SetSamaProtity(ListTType, item, assembly, IngoreFieldCase);
                                        AddMethodInfo.Invoke(ObjListT, new object[] { obj });
                                    }
                                }


                                if (IsList)
                                {
                                    KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, ObjListT);
                                }
                                else
                                {
                                    MethodInfo ToArrayMethodInfo = ListType.GetMethod("ToArray");
                                    if (ToArrayMethodInfo != null)
                                    {
                                        var ArrObj = ToArrayMethodInfo.Invoke(ObjListT, null);
                                        KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, ArrObj);
                                    }
                                }
                            }


                            #endregion
                        }
                        else if (fi.FieldType.IsClass && !fi.FieldType.IsPrimitive && fi.FieldType.Name.ToLower().IndexOf("string") < 0)
                        {
                            var obj = SetSamaProtity(fi.FieldType, GetObjVal, assembly, IngoreFieldCase);
                            KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, obj);
                        }
                        else
                        {
                            KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, GetObjVal);
                        }
                }
            }
            else
            {
                //遍历该model实体的所有字段
                foreach (System.Reflection.PropertyInfo fi in Set_PropertyInfos)
                {
                    //设置值
                    var SetObjVal = fi.GetValue(SetobjModel);
                    string DataType = fi.PropertyType.Name;
                    //获取值
                    object GetObjVal = null;
                    if (IsDynamic)
                    {
                        var WhereGetfi_s = ((IDictionary<string, object>)GetobjModel).Where(x => IngoreFieldCase ? (x.Key.ToUpper() == fi.Name.ToUpper()) : x.Key == fi.Name);
                        if (WhereGetfi_s.Any())
                        {
                            var Getfi = WhereGetfi_s.First();
                            GetObjVal = Getfi.Value;
                        }
                    }
                    else
                    {
                        var WhereGetfi_s = Get_PropertyInfos.Where(x => IngoreFieldCase ? (x.Name.ToUpper() == fi.Name.ToUpper()) : x.Name == fi.Name);
                        if (WhereGetfi_s.Any())
                        {
                            var Getfi = WhereGetfi_s.First();
                            GetObjVal = Getfi.GetValue(GetobjModel);
                        }
                    }




                    if (GetObjVal == null)
                        continue;
                    //泛型
                    if (fi.PropertyType.IsGenericType && fi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                        //泛型 类型
                        var Arguments = fi.PropertyType.GetGenericArguments();
                        Type ChildType = Arguments[0].GetType();
                    }
                    //判断是否派生自IEnumerable(string 是特殊的数组)
                    else //if (fi.PropertyType.GetInterface("IEnumerable", false) != null && DataType.ToLower().IndexOf("string") < 0)
                        if (fi.PropertyType.GetInterface("IEnumerable", false) != null &&
                        (fi.PropertyType.Name.ToLower().IndexOf("string") < 0 ||
                        (fi.PropertyType.Name.ToLower().IndexOf("string") >= 0 &&
                        (fi.PropertyType.Name.ToLower().IndexOf("[]") > 0 || fi.PropertyType.Name.ToLower().IndexOf("<") > 0))))
                        {
                            var Arrobjval = GetObjVal as System.Collections.IEnumerable;


                            //是List数组还是Array数组
                            bool IsList = true;


                            #region  创建List<T> 实例 并赋值


                            Type ListTType = null;//泛型类
                            var IEnumerableTypes = fi.PropertyType.GetGenericArguments();
                            if (IEnumerableTypes.Any())
                            {
                                //List<> 数组
                                ListTType = IEnumerableTypes[0];
                            }
                            else
                            {
                                //数组
                                ListTType = null;//数组类型
                                ListTType = assembly.GetType(fi.PropertyType.FullName.Replace("[]", ""));
                                IsList = false;
                            }


                            Type ListType = typeof(List<>);
                            ListType = ListType.MakeGenericType(ListTType);
                            //创建List数组实例
                            var ObjListT = Activator.CreateInstance(ListType);
                            Type argsType = GetObjVal.GetType();
                            //if (argsType.GetInterface("IEnumerable", false) != null && (argsType.Name.ToLower().IndexOf("string") < 0 && argsType.Name.ToLower().IndexOf("[]") < 0 && argsType.Name.ToLower().IndexOf("<") < 0))
                            if (argsType.GetInterface("IEnumerable", false) != null &&
                            (argsType.Name.ToLower().IndexOf("string") < 0 ||
                            (argsType.Name.ToLower().IndexOf("string") >= 0 &&
                            (argsType.Name.ToLower().IndexOf("[]") > 0 || argsType.Name.ToLower().IndexOf("<") > 0))))
                            {
                                MethodInfo AddMethodInfo = ListType.GetMethod("Add");
                                if (AddMethodInfo != null)
                                {
                                    foreach (var item in Arrobjval)
                                    {
                                        var obj = SetSamaProtity(ListTType, item, assembly, IngoreFieldCase);
                                        AddMethodInfo.Invoke(ObjListT, new object[] { obj });
                                    }
                                }
                                if (IsList)
                                {
                                    KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, ObjListT);
                                }
                                else
                                {
                                    MethodInfo ToArrayMethodInfo = ListType.GetMethod("ToArray");
                                    if (ToArrayMethodInfo != null)
                                    {
                                        var ArrObj = ToArrayMethodInfo.Invoke(ObjListT, null);
                                        KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, ArrObj);
                                    }
                                }
                            }


                            #endregion
                        }
                        else if (fi.PropertyType.IsClass && !fi.PropertyType.IsPrimitive && fi.PropertyType.Name.ToLower().IndexOf("string") < 0)
                        {
                            var obj = SetSamaProtity(fi.PropertyType, GetObjVal, assembly, IngoreFieldCase);
                            KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, obj);
                        }
                        else
                        {
                            KSWECDS.Web.Extensions.Common.setProtityValue(SetobjModel, fi, GetObjVal);
                        }
                }
            }


            #endregion


            return SetobjModel;
        }


        /// </summary>  
        /// 根据指定的信息,调用远程WebService方法  
        /// </summary>  
        /// <param name="url">WebService的http形式的地址</param>  
        /// <param name="methodname">欲调用的WebService的方法名</param>  
        /// <param name="args">参数列表</param>  
        /// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>  
        /// <returns>WebService的执行结果</returns>  
        public static Tuple<bool, object> InvokeWebServiceOutPutDLL(string url, string methodname, object[] args, string _ModelPath, OracleParameter[] Param_s, string UserName = "", string PasswordStr = "", string classname = "", string retErrTypeStr = "")
        {
            string ErrLogSubject = "调用" + methodname + "接口错误";
            try
            {
                string nameSpace = "WebServiceDynamic";
                string XMLPath = System.Configuration.ConfigurationManager.AppSettings["WebServiceSettingModelPath"] ?? "\\WebServiceWSDL\\";
                if (_ModelPath.IndexOf(".") > 0)
                    _ModelPath = _ModelPath.Substring(0, _ModelPath.LastIndexOf("\\"));
                if (_ModelPath.IndexOf(":") <= 0)
                {
                    if (_ModelPath.IndexOf(XMLPath) < 0)
                        _ModelPath = XMLPath + _ModelPath;
                    if (HttpContext.Current == null || HttpContext.Current.Server == null)
                        _ModelPath = KSWECDS.Web.Extensions.Common.GetMapPath(_ModelPath);
                    else
                        _ModelPath = HttpContext.Current.Server.MapPath(_ModelPath);
                }


                //动态WebService Type
                Type WebServiceType = null;
                System.Reflection.Assembly assembly = null;
                //WebService名称
                string DLLName = getMd5Str(url);
                WriteLogHelper.WriteLog("DLLFilePath-" + url);
                string DLLFilePath = _ModelPath + "\\" + DLLName + ".dll";
                if (checkIsInCache(DLLFilePath))
                {
                    assembly = Assembly.LoadFrom(DLLFilePath);
                    WriteLogHelper.WriteLog("assembly-" + DLLFilePath);
                    //WebServiceType = _assembly.GetType();
                    Type[] types = assembly.GetTypes();
                    string objTypeName = "";
                    foreach (Type t in types)
                    {
                        if (t.BaseType == typeof(System.Web.Services.Protocols.SoapHttpClientProtocol))
                        {
                            objTypeName = t.Name;
                            WebServiceType = t;
                            break;
                        }
                    }
                    WriteLogHelper.WriteLog("objTypeName-" + objTypeName);
                }
                if (WebServiceType == null)
                {
                    #region 动态创建 WebService类


                    //1.使用WebClient 下载WSDL信息
                    WebClient wc = new WebClient();
                    if (!string.IsNullOrEmpty(UserName))
                        wc.Credentials = new NetworkCredential(UserName, PasswordStr);
                    Stream stream = wc.OpenRead(url);
                    //2.创建和格式化WSDL文档
                    ServiceDescription srvDesc = ServiceDescription.Read(stream);
                    List<System.Web.Services.Description.Service> ArrServices = new List<System.Web.Services.Description.Service>();
                    foreach (System.Web.Services.Description.Service item in srvDesc.Services)
                    {
                        ArrServices.Add(item);
                    }
                    if (ArrServices.Any())
                    {
                        var WhereArrServices = ArrServices.Where(x => x.Name.ToLower() == classname);
                        if (!WhereArrServices.Any())
                            classname = ArrServices.FirstOrDefault().Name;
                    }
                    else
                    {
                        WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, "服务不存在", methodname, Param_s);
                        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"服务不存在");
                        return retobj;
                    }


                    //加锁
                    lock (WebServiceLockObj.lockAssemblyWebServiceFileCopy)
                    {
                        //3. 创建客户端代理代理类
                        ServiceDescriptionImporter srvDescInporter = new ServiceDescriptionImporter();
                        srvDescInporter.ProtocolName = "Soap";//指定访问协议
                        srvDescInporter.Style = ServiceDescriptionImportStyle.Client;//生成客户端代理,默认。
                        srvDescInporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
                        srvDescInporter.AddServiceDescription(srvDesc, "", ""); //添加WSDL文档。
                        //4 .使用 CodeDom 编译客户端代理类。
                        CodeNamespace codeNamespce = new CodeNamespace(nameSpace);// 为代理类添加命名空间,缺省为全局空间。  
                        CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
                        codeCompileUnit.Namespaces.Add(codeNamespce);
                        srvDescInporter.Import(codeNamespce, codeCompileUnit);
                        //代码生成器
                        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                        //表示用于调用编译器的参数。
                        System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                        parameter.GenerateExecutable = false;   //设置是否生成可执行文件。
                        parameter.GenerateInMemory = false;//是否在内存中输出
                        parameter.IncludeDebugInformation = false;//是否在已编译的可执行文件中包含调试信息  
                        //parameter.OutputAssembly = DLLName + "_" + (new Random().Next(1, 999).ToString("000")) + ".dll";// "WebServiceDynamic.dll"; // 可以指定你所需的任何文件名。 
                        parameter.ReferencedAssemblies.Add("System.dll");   //ReferencedAssemblies  获取当前项目所引用的程序集。
                        parameter.ReferencedAssemblies.Add("System.XML.dll");
                        parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                        parameter.ReferencedAssemblies.Add("System.Data.dll");


                        //获取从编译器返回的编译结果。
                        System.CodeDom.Compiler.CompilerResults cr = provider.CompileAssemblyFromDom(parameter, codeCompileUnit);
                        provider.Dispose();
                        if (true == cr.Errors.HasErrors)
                        {
                            System.Text.StringBuilder sb = new System.Text.StringBuilder();
                            foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                            {
                                sb.Append(ce.ToString());
                                sb.Append(System.Environment.NewLine);
                            }
                            //throw new Exception(sb.ToString());
                            WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, "创建DLL错误," + sb.ToString(), methodname, Param_s);
                            Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)sb.ToString());
                            return retobj;
                        }
                        File.Copy(cr.PathToAssembly, DLLFilePath);


                        //获取已编译的程序集,然后通过反射进行动态调用。
                        assembly = Assembly.LoadFrom(DLLFilePath);
                        //WriteLogHelper.WriteLog("assemblyDLL-" + nameSpace + "." + classname);
                        WebServiceType = assembly.GetType(nameSpace + "." + classname); // 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
                    }
                    #endregion
                }
                if (WebServiceType != null)
                {
                    object obj = Activator.CreateInstance(WebServiceType);//创建实例
                    //WriteLogHelper.WriteLog("CreateInstance-" + WebServiceType.Name);
                    var WebServiceProtitys = obj.GetType().GetProperties();
                    var WhereCredentials = WebServiceProtitys.Where(x => x.Name.IndexOf("Credentials") >= 0);
                    if (WhereCredentials.Any())
                    {
                        if (!string.IsNullOrEmpty(UserName))
                        {
                            WhereCredentials.FirstOrDefault().SetValue(obj, new NetworkCredential(UserName, PasswordStr));
                        }
                    }
                    MethodInfo[] ServiceMethods = WebServiceType.GetMethods();//获取所有方法
                    System.Reflection.MethodInfo mi = ServiceMethods.Where(x => x.Name.ToLower() == methodname.ToLower()).FirstOrDefault(); //获取指定方法
                    if (mi != null)
                    {
                        List<object> MethodObj = new List<object>();
                        if (args != null)
                        {
                            ParameterInfo[] Parameters = mi.GetParameters();//获取所有参数
                            for (int i = 0; i < Parameters.Length; i++)
                            {
                                if (args.Length > i)
                                {
                                    ParameterInfo itemMethodParm = Parameters[i];
                                    Type MethodParmType = itemMethodParm.ParameterType;
                                    if (MethodParmType.GetInterface("IEnumerable", false) != null &&
                                        (MethodParmType.Name.ToLower().IndexOf("string") < 0 ||
                                        (MethodParmType.Name.ToLower().IndexOf("string") >= 0 &&
                                        (MethodParmType.Name.ToLower().IndexOf("[]") > 0 || MethodParmType.Name.ToLower().IndexOf("<") > 0))))
                                    {
                                        //是List数组还是Array数组
                                        bool IsList = true;


                                        #region  创建List<T> 实例 并赋值 不管是否是 Array数组 都先实例化 List数组


                                        Type ListTType = null;//泛型类
                                        var IEnumerableTypes = MethodParmType.GetGenericArguments();
                                        if (IEnumerableTypes.Any())
                                        {
                                            //List<> 数组
                                            ListTType = IEnumerableTypes[0];
                                        }
                                        else
                                        {
                                            //数组
                                            ListTType = null;//数组类型
                                            ListTType = assembly.GetType(MethodParmType.FullName.Replace("[]", ""));
                                            IsList = false;
                                        }
                                        if (ListTType != null)
                                        {
                                            Type ListType = typeof(List<>);
                                            ListType = ListType.MakeGenericType(ListTType);
                                            //创建List<T> 数组 实例
                                            var ObjListT = Activator.CreateInstance(ListType);
                                            //List数组的Add方法
                                            MethodInfo AddMethodInfo = ListType.GetMethod("Add");
                                            if (AddMethodInfo != null)
                                            {
                                                Type argsType = args[i].GetType();
                                                if (argsType.GetInterface("IEnumerable", false) != null &&
                                                (argsType.Name.ToLower().IndexOf("string") < 0 ||
                                                (argsType.Name.ToLower().IndexOf("string") >= 0 &&
                                                (argsType.Name.ToLower().IndexOf("[]") > 0 || argsType.Name.ToLower().IndexOf("<") > 0))))
                                                {
                                                    var ArrIEnumerable = args[i] as System.Collections.IEnumerable;
                                                    foreach (var itemIE in ArrIEnumerable)
                                                    {
                                                        //转换类型 并相同字段赋值
                                                        var ListitemObj = SetSamaProtity(ListTType, itemIE, assembly, true);
                                                        //执行 List数组的Add方法
                                                        AddMethodInfo.Invoke(ObjListT, new object[] { ListitemObj });
                                                    }
                                                    if (IsList)
                                                    {
                                                        MethodObj.Add(ObjListT);
                                                    }
                                                    else
                                                    {
                                                        MethodInfo ToArrayMethodInfo = ListType.GetMethod("ToArray");
                                                        if (ToArrayMethodInfo != null)
                                                        {
                                                            var ArrObj = ToArrayMethodInfo.Invoke(ObjListT, null);
                                                            MethodObj.Add(ArrObj);
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, "参数类型不匹配", methodname, Param_s);
                                                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"参数类型不匹配");
                                                    return retobj;
                                                }
                                            }
                                        }


                                        #endregion
                                    }
                                    else
                                    {
                                        MethodObj.Add(SetSamaProtity(MethodParmType, args[i], assembly, true));
                                    }
                                }
                                else
                                    MethodObj.Add(null);
                            }
                        }
                        else
                        {
                            MethodObj = new List<object>();
                        }
                        Type retType = mi.ReturnType;
                        //try
                        //{
                        //    WriteLogHelper.WriteLog(mi.Name + "-" + Newtonsoft.Json.JsonConvert.SerializeObject(MethodObj));
                        //}
                        //catch (Exception ex)
                        //{


                        //}


                        bool IsWriteServiceLog = false;//是否保留报文
                        if (StrWriteServiceLog == "1")
                        {
                            IsWriteServiceLog = true;
                        }
                        else if (StrWriteServiceLog == "是")
                        {
                            IsWriteServiceLog = true;
                        }
                        else if (StrWriteServiceLog.ToLower() == "true")
                        {
                            IsWriteServiceLog = true;
                        }


                        string LabelStr = methodname + "(" + url + ")";
                        //报文
                        string MethodParamJsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(MethodObj);
                        if (IsWriteServiceLog)
                        {
                            //加锁
                            lock (WebServiceLockObj.lockWebServiceHelperWriteLog)
                            {
                                SQLDALHelper.WriteLogHelper.WriteLog(MethodParamJsonObj, ServiceLogAddress, true, false, LabelStr);
                            }
                        }


                        var _Methodretobj = mi.Invoke(obj, MethodObj.ToArray());
                        string MethodretobjStr = "";
                        if (_Methodretobj != null)
                        {
                            if (!_Methodretobj.GetType().Equals(typeof(System.String)))
                                MethodretobjStr = Newtonsoft.Json.JsonConvert.SerializeObject(_Methodretobj);
                            else
                                MethodretobjStr = _Methodretobj.ToString();
                        }
                        if (MethodretobjStr.Contains("锁定"))
                        {
                            WebdbContext AppContxt = new WebdbContext();
                            TMLockJson OTMLockJson = new TMLockJson();
                            OTMLockJson.IsUnLock = false;
                            OTMLockJson.JsonStr = MethodParamJsonObj;
                            OTMLockJson.LockKey = "锁定";
                            OTMLockJson.Url = url;
                            OTMLockJson.MethodName = methodname;
                            OTMLockJson.UserName = UserName;
                            OTMLockJson.PasswordStr = PasswordStr;
                            OTMLockJson.retErrTypeStr = retErrTypeStr;
                            var dbSet = AppContxt.TMLockJson.Attach(OTMLockJson);
                            dbSet.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added;
                            AppContxt.Entry(OTMLockJson).State = System.Data.Entity.EntityState.Added;
                            AppContxt.SaveChanges();
                        }
                        Tuple<bool, object> _retobj = new Tuple<bool, object>(true, MethodretobjStr);
                        return _retobj;
                    }
                    else
                    {
                        WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, "要执行的方法不存在", methodname, Param_s);
                        Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"要执行的方法不存在");
                        return retobj;
                    }
                }
                else
                {
                    WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, "找不到可执行的WebService服务类Type", methodname, Param_s);
                    Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)"找不到可执行的WebService服务类Type");
                    return retobj;
                }
            }
            catch (Exception ex)
            {
                //throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                string ErrMsg = KSWECDS.Web.Extensions.Common.GetExceptionMsg(ex);
                WirteLog(ErrLogSubject, "调用" + methodname + "错误", url, ErrMsg, methodname, Param_s);
                Tuple<bool, object> retobj = new Tuple<bool, object>(false, (object)ErrMsg);
                return retobj;
            }
        }


        /// <summary>
        /// 获取MD5字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string getMd5Str(string str)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();


            //Encoder enc = System.Text.Encoding.Unicode.GetEncoder();
            //byte[] unicodeText = new byte[str.Length * 2];
            //enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);
            //MD5 md5 = new MD5CryptoServiceProvider();
            //byte[] result = md5.ComputeHash(unicodeText);
            //StringBuilder sb = new StringBuilder();
            //for (int i = 0; i < result.Length; i++)
            //{
            //    sb.Append(result[i].ToString("X2"));
            //}
            //return sb.ToString();
        }


        /// <summary>                           
        /// 是否已经存在该程序集                                
        /// </summary>                                  
        /// <returns>false:不存在该程序集,true:已经存在该程序集</returns>                                
        private static bool checkIsInCache(string dllFilePath)
        {
            if (File.Exists(dllFilePath))
            {
                return true;
            }
            return false;
        }


        /// <summary>
        /// 添加服务错误日志
        /// </summary>
        /// <param name="notificationTag"></param>
        /// <param name="subject"></param>
        /// <param name="key1"></param>
        /// <param name="key2"></param>
        /// <param name="content"></param>
        /// <param name="messageType"></param>
        public static void WirteLog(string subject, string key1, string key2, string content, string methodname, OracleParameter[] Param_s, KSWECDS.Web.Models.MessageType MsgType = KSWECDS.Web.Models.MessageType.Error)
        {
            try
            {
                string Key1_Str = "";
                foreach (var item in Param_s)
                {
                    if (string.IsNullOrEmpty(Key1_Str))
                        Key1_Str += item.ParameterName + ":" + item.Value.ToString();
                    else
                        Key1_Str += "," + item.ParameterName + ":" + item.Value.ToString();
                }
                //清除其他实体的操作
                appContext = new WebdbContext();
                unitOfWork_ = new Repository.Pattern.Ef6.UnitOfWork(appContext);
                foreach (var item in appContext.ChangeTracker.Entries())
                {
                    item.State = System.Data.Entity.EntityState.Unchanged;
                }


                var NotificationRep = unitOfWork_.Repository<Notification>();
                var MessageRep = unitOfWork_.Repository<KSWECDS.Web.Models.Message>();
                string name = NotificationTag.TMService.ToString();
                var notification = NotificationRep.Queryable().Where(x => x.Name == name).FirstOrDefault();
                if (notification != null)
                {
                    KSWECDS.Web.Models.Message message = new KSWECDS.Web.Models.Message();
                    message.Content = content;
                    message.Key1 = Key1_Str;
                    message.Key2 = key2;
                    message.CreatedDate = DateTime.Now;
                    message.NewDate = DateTime.Now;
                    message.NotificationId = notification.Id;
                    message.Subject = subject;
                    message.Type = MsgType.ToString();
                    message.CreatedBy = methodname;
                    message.CreatedDate = DateTime.Now;
                    MessageRep.Insert(message);
                }
                unitOfWork_.SaveChanges();
            }
            catch (Exception ex)
            {


            }
        }


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#动态调用WebService有多种方式。其中一种方式是使用SoapHttpClientProtocol类。这种方式需要将添加WebService引用生成的Reference.cs类中的服务接口集成到自己定义的服务调用类中,而且服务调用类需要继承自SoapHttpClientProtocol。如果服务接口发生了改变,需要修改服务调用类。以下是一个示例代码: ```csharp public class MySoapHttpClientProtocol : SoapHttpClientProtocol { public MySoapHttpClientProtocol(string url) { Url = url; } [SoapHeader("ClientContext")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace = MyNamespace, ResponseNamespace = MyNamespace, Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [return: System.Xml.Serialization.XmlElementAttribute("out", IsNullable = true)] public string myMethod([System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] string in0) { try { object[] results = this.Invoke("getConnection", new object[] { in0 }); return ((string)(results<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [C# 动态调用WebService](https://blog.csdn.net/chthq/article/details/19628775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值