您的位置:首页 > 编程语言 > C#

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

2017-04-17 14:47 411 查看
/// <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)

{

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: