MESSeries_Bate/MESws_STD/DataExchange.cs
2025-05-20 17:00:22 +08:00

1083 lines
43 KiB
C#

using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using System.Xml;
using static iMESCore.Base.iMESComSubroutine;
using static iMESCore.Base.iMESComXML;
namespace MESws
{
internal class DataExchange
{
/// <summary>
/// 2020/04/24 雋辰,XML string convert DataSet
/// </summary>
/// <param name="OutXml"></param>
/// <param name="columns">資料表需求欄位</param>
/// <returns></returns>
public static DataSet XmlString2DataSet(string OutXml, string[] columns = null)
{
DataSet result = null;
StringReader tmpStringReader; // 將字串轉換成可讀入DataSet的物件
var XmlDoc = new XmlDocument();
XmlElement xElement_Schema = null;
string FirstChildName = "";
string XmlSchema = "";
string XmlData = ""; // 儲存取回之資料
var aryException = new List<ArrayList>(); // Exception
try
{
using (var dsReturn = new DataSet())
{
// 利用XmlDoc物件處理ReturnValue
XmlDoc.LoadXml(OutXml);
// 找出第一個節點
FirstChildName = XmlDoc.FirstChild.Name;
// 取出Schema
XmlSchema = XmlDoc.FirstChild.SelectSingleNode("schema").InnerXml;
if (!string.IsNullOrEmpty(XmlSchema))
{
// 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件
tmpStringReader = new StringReader(XmlSchema);
dsReturn.ReadXmlSchema(tmpStringReader);
tmpStringReader.Close();
}
// 取出Data
XmlData = XmlDoc.FirstChild.SelectSingleNode("value").InnerXml;
if (!string.IsNullOrEmpty(XmlData))
{
tmpStringReader = new StringReader(XmlData);
dsReturn.ReadXml(tmpStringReader, XmlReadMode.InferSchema);
tmpStringReader.Close();
}
// 欄位轉大寫
ColumnName_ToUpper(dsReturn);
// 只取需要的欄位
DataSet ds = (DataSet)Specify_Field(dsReturn, new List<string[]>() { columns });
result = ds;
}
}
catch (Exception ex)
{
throw;
}
return result;
}
/// <summary>
/// 2020/05/28 雋辰,XML string convert JObject , 為了因應xml有多個根節點(多個類型的資料)
/// </summary>
/// <param name="OutXml"></param>
/// <param name="columns">資料表需求欄位</param>
/// <returns></returns>
public static JObject XmlString2JsonObj(string OutXml, string[] columns = null)
{
var result = new JObject();
JToken tempToken;
var XmlDoc = new XmlDocument();
string XmlSchema = "";
string XmlData = ""; // 儲存取回之資料
string rootName = "tempRoot";
string key = "";
string tempKey;
bool firstDataSet = true;
try
{
// 利用XmlDoc物件處理ReturnValue
XmlDoc.LoadXml(string.Format("<{0}>{1}</{0}>", rootName, OutXml));
var root = XmlDoc.SelectSingleNode(rootName);
foreach (XmlNode node in root.ChildNodes)
{
if (!(node.SelectSingleNode("name") == null) && !(node.SelectSingleNode("type") == null) && !(node.SelectSingleNode("value") == null))
{
if (node.SelectSingleNode("type").InnerXml.ToUpper() == "DATASET")
{
if (node.SelectSingleNode("schema") == null)
continue;
XmlSchema = node.SelectSingleNode("schema").InnerXml;
if (string.IsNullOrEmpty(XmlSchema))
continue;
var ds = new DataSet();
using (var tmpStringReader = new StringReader(XmlSchema))
{
ds.ReadXmlSchema(tmpStringReader);
}
DataSet dsSpecify;
if (firstDataSet)
{
dsSpecify = (DataSet)Specify_Field(ds, new List<string[]>() { columns });
firstDataSet = false;
}
else
{
dsSpecify = ds;
}
XmlData = node.SelectSingleNode("value").InnerXml;
if (!string.IsNullOrEmpty(XmlData))
{
using (var tmpStringReader = new StringReader(XmlData))
{
dsSpecify.ReadXml(tmpStringReader, XmlReadMode.Auto);
}
}
ColumnName_ToUpper(dsSpecify);
foreach (DataTable dt in dsSpecify.Tables)
{
key = dt.TableName;
tempKey = key;
tempToken = result[key];
if (!(tempToken == null))
{
int index = 2;
do
{
tempKey = string.Format("{0}({1})", key, index);
tempToken = result[tempKey];
index += 1;
}
while (tempToken != null);
}
result.Add(tempKey, JToken.Parse(JsonConvert.SerializeObject(dt)));
}
}
else
{
key = node.SelectSingleNode("name").InnerXml;
if (string.IsNullOrEmpty(key))
continue;
tempKey = key;
tempToken = result[key];
if (!(tempToken == null))
{
int index = 2;
do
{
tempKey = string.Format("{0}({1})", key, index);
tempToken = result[tempKey];
index += 1;
}
while (tempToken != null);
}
result.Add(tempKey, node.SelectSingleNode("value").InnerXml);
}
}
}
}
catch (Exception ex)
{
throw;
}
return result;
}
/// <summary>
/// 2020/07/31 雋辰,XML string convert JObject for wsSTD
/// </summary>
/// <param name="OutXml"></param>
/// <param name="columns">資料表需求欄位</param>
/// <returns></returns>
public static JObject XmlString2JsonObj_wsSTD(ref string stack, string OutXml, string[] columns = null, string language = "", string resourceDir = "Resource")
{
var result = new JObject();
JToken tempToken;
var XmlDoc = new XmlDocument();
string XmlSchema = "";
string XmlData = ""; // 儲存取回之資料
string rootName = "returnvalue";
string key = "";
string tempKey;
bool firstDataSet = true;
try
{
// 利用XmlDoc物件處理ReturnValue
XmlDoc.LoadXml(OutXml);
if (!chkExecutionSuccess(XmlDoc))
{
string exCode = GetExceptionCode(XmlDoc);
string exMsg = GetExceptionSysMsg(XmlDoc);
string exStack = GetExceptionStack(XmlDoc);
stack = exStack;
var iex = new iMESException.MESException(exCode, exMsg);
throw new System.Reflection.TargetInvocationException(exMsg, iex);
}
var response = XmlDoc.SelectSingleNode("response");
if (response == null)
throw new iMESException.MESException("0000-200091", "OutXML [%Format Error%]");
// 20210408 13871,執行結果success/fail
var resultTag = response.SelectSingleNode("result");
if (!(resultTag == null))
result.Add("ReturnValue", resultTag.InnerText);
// 20210408 13871,額外訊息message tag下的資訊
// <message>
// <note>
// <mcode>
// <mtype>
// <mmsg>
// </note>
// <note>
// <mcode>
// <mtype>
// <mmsg>
// </note>
var messageTag = response.SelectSingleNode("message");
if (!(messageTag == null))
{
var dtMessage = new DataTable();
dtMessage.Columns.Add("MCODE");
dtMessage.Columns.Add("MTYPE");
dtMessage.Columns.Add("MMSG");
var notes = messageTag.SelectNodes("note");
for (int i = 0, loopTo = notes.Count - 1; i <= loopTo; i++)
{
var drTmp = dtMessage.NewRow();
if (!(notes.Item(i).SelectSingleNode("mcode") == null))
{
drTmp["MCODE"] = notes.Item(i).SelectSingleNode("mcode").InnerText;
}
if (!(notes.Item(i).SelectSingleNode("mtype") == null))
{
drTmp["MTYPE"] = notes.Item(i).SelectSingleNode("mtype").InnerText;
}
if (!(notes.Item(i).SelectSingleNode("mmsg") == null))
{
drTmp["MMSG"] = TranslateMsg(notes.Item(i).SelectSingleNode("mmsg").InnerText, language, resourceDir);
}
dtMessage.Rows.Add(drTmp);
}
result.Add("RETURNMESSAGE", JToken.Parse(JsonConvert.SerializeObject(dtMessage)));
}
// 20210408 13871,回傳的結果於returnvalue tag下的資訊
var root = response.SelectSingleNode(rootName);
if (!(root == null))
{
foreach (XmlNode node in root.ChildNodes)
{
if (!(node.SelectSingleNode("name") == null) && !(node.SelectSingleNode("type") == null) && !(node.SelectSingleNode("value") == null))
{
if (node.SelectSingleNode("type").InnerXml.ToUpper() == "DATASET")
{
if (node.SelectSingleNode("schema") == null)
continue;
XmlSchema = node.SelectSingleNode("schema").InnerXml;
if (string.IsNullOrEmpty(XmlSchema))
continue;
var ds = new DataSet();
using (var tmpStringReader = new StringReader(XmlSchema))
{
ds.ReadXmlSchema(tmpStringReader);
}
DataSet dsSpecify;
if (firstDataSet)
{
dsSpecify = (DataSet)Specify_Field(ds, new List<string[]>() { columns });
firstDataSet = false;
}
else
{
dsSpecify = ds;
}
XmlData = node.SelectSingleNode("value").InnerXml;
if (!string.IsNullOrEmpty(XmlData))
{
using (var tmpStringReader = new StringReader(XmlData))
{
dsSpecify.ReadXml(tmpStringReader, XmlReadMode.Auto);
}
}
ColumnName_ToUpper(dsSpecify);
foreach (DataTable dt in dsSpecify.Tables)
{
key = dt.TableName;
tempKey = key;
tempToken = result[key];
if (!(tempToken == null))
{
int index = 2;
do
{
tempKey = string.Format("{0}({1})", key, index);
tempToken = result[tempKey];
index += 1;
}
while (tempToken != null);
}
result.Add(tempKey, JToken.Parse(JsonConvert.SerializeObject(dt)));
}
}
else
{
key = node.SelectSingleNode("name").InnerXml;
if (string.IsNullOrEmpty(key))
continue;
tempKey = key;
tempToken = result[key];
if (!(tempToken == null))
{
int index = 2;
do
{
tempKey = string.Format("{0}({1})", key, index);
tempToken = result[tempKey];
index += 1;
}
while (tempToken != null);
}
result.Add(tempKey, node.SelectSingleNode("value").InnerXml);
}
}
}
}
}
catch (Exception ex)
{
throw;
}
return result;
}
/// <summary>
/// 2020/04/24 雋辰,輸出指定欄位資料表
/// </summary>
/// <param name="ds"></param>
/// <param name="columns"></param>
/// <returns></returns>
public static object Specify_Field(DataSet ds, List<string[]> columns)
{
var result = new DataSet();
if (!(ds == null))
{
for (int i = 0, loopTo = ds.Tables.Count - 1; i <= loopTo; i++)
{
if (!(columns == null) && columns.Count > i && !(columns[i] == null))
{
result.Tables.Add(ds.Tables[i].DefaultView.ToTable(false, columns[i]));
}
else
{
result.Tables.Add(ds.Tables[i].Copy());
}
}
}
return result;
}
/// <summary>
/// 2020/04/24 雋辰,欄位名稱轉大寫
/// </summary>
/// <param name="ds"></param>
public static void ColumnName_ToUpper(DataSet ds)
{
if (!(ds == null))
{
foreach (DataTable dt in ds.Tables)
{
foreach (DataColumn dc in dt.Columns)
dc.ColumnName = dc.ColumnName.ToUpper();
}
}
}
/// <summary>
/// 2020/09/28 雋辰,欄位名稱轉大寫
/// </summary>
/// <param name="dt"></param>
public static void ColumnName_ToUpper(DataTable dt)
{
if (!(dt == null))
{
foreach (DataColumn dc in dt.Columns)
dc.ColumnName = dc.ColumnName.ToUpper();
}
}
/// <summary>
/// 2020/06/10 雋辰,處理Transfer
/// </summary>
/// <param name="listTransfer"></param>
/// <param name="val">call function result</param>
/// <param name="transferGlobal"></param>
/// <param name="transferSingle"></param>
public static void ProcessTransfer(List<JToken> listTransfer, object val, ref Dictionary<string, object> transferGlobal, ref Dictionary<string, object> transferSingle)
{
string strTransferLevel;
string strTransferParName;
string strTransferValue;
Dictionary<string, object> addTransfer;
if (listTransfer == null || listTransfer.Count <= 0 || transferGlobal == null || transferSingle == null)
return;
// 處理傳遞引數
foreach (JToken item in listTransfer)
{
var dicTemp = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.ToString());
var dicProp = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (string key in dicTemp.Keys)
dicProp[key] = dicTemp[key];
if (!dicProp.ContainsKey("level") || !dicProp.ContainsKey("value") || !dicProp.ContainsKey("parname"))
continue;
strTransferLevel = dicProp["level"].ToUpper();
strTransferParName = dicProp["parname"];
strTransferValue = dicProp["value"].ToUpper();
if (strTransferLevel == "G")
{
addTransfer = transferGlobal;
}
else if (strTransferLevel == "S")
{
addTransfer = transferSingle;
}
else
{
continue;
}
if (addTransfer == null)
continue;
if (val.GetType().Equals(typeof(DataSet)))
{
DataSet ds = val as DataSet;
if (strTransferValue == "M_RESULT")
{
addTransfer[strTransferParName] = ds.Tables[0];
}
else if (ds.Tables[0].Columns.Contains(strTransferValue))
addTransfer[strTransferParName] = ds.Tables[0].Rows.Count > 0 ? ds.Tables[0].Rows[0][strTransferValue] : "";
}
else if (val.GetType().Equals(typeof(JObject)))
{
JObject jObj = val as JObject;
var list = (from prop in jObj.Properties()
select prop.Name.ToUpper()).ToList();
if (strTransferValue == "M_RESULT")
strTransferValue = "RETURNVALUE";
if (list.Contains(strTransferValue))
{
foreach (JProperty p in jObj.Properties())
{
if (p.Name.ToUpper() == strTransferValue)
{
if (p.Value.GetType().Equals(typeof(JArray)))
{
var ds = JsonConvert.DeserializeObject<DataSet>("{" + p.ToString() + "}");
addTransfer[strTransferParName] = ds.Tables[0];
break;
}
else
{
addTransfer[strTransferParName] = p.Value.ToString();
break;
}
}
}
}
}
else if (strTransferValue == "M_RESULT")
addTransfer[strTransferParName] = val;
}
}
/// <summary>
/// 2020/07/31 雋辰,處理Transfer
/// </summary>
/// <param name="listTransfer"></param>
/// <param name="val">call function result</param>
/// <param name="transferGlobal"></param>
/// <param name="transferSingle"></param>
public static void ProcessTransfer_Load(List<JToken> listTransfer, JObject jObj, ref Dictionary<string, object> transferGlobal, ref Dictionary<string, object> transferSingle)
{
string strTransferLevel;
string strTransferParName;
string strTransferValue;
Dictionary<string, object> addTransfer;
if (!(listTransfer == null) && !(transferGlobal == null) && !(transferSingle == null))
{
foreach (JToken item in listTransfer)
{
var dicTemp = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.ToString());
var dicProp = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (string key in dicTemp.Keys)
dicProp[key] = dicTemp[key];
if (!dicProp.ContainsKey("level") || !dicProp.ContainsKey("value") || !dicProp.ContainsKey("parname"))
continue;
strTransferLevel = dicProp["level"].ToUpper();
strTransferParName = dicProp["parname"];
strTransferValue = dicProp["value"].ToUpper();
if (strTransferLevel == "G")
{
addTransfer = transferGlobal;
}
else if (strTransferLevel == "S")
{
addTransfer = transferSingle;
}
else
{
continue;
}
if (addTransfer == null)
continue;
if (strTransferValue == "M_RESULT")
{
foreach (JProperty subResult in jObj.Children())
{
if (subResult.ToString().Contains("[") && subResult.ToString().Contains("]"))
{
var ds = JsonConvert.DeserializeObject<DataSet>("{" + subResult.ToString() + "}");
addTransfer[strTransferParName] = ds.Tables[0];
break;
}
}
}
else
{
foreach (JProperty subResult in jObj.Children())
{
// 沒有想到合適的方式區分一般值與DataSet
if (subResult.Value.GetType().Equals(typeof(JArray)))
{
var ds = JsonConvert.DeserializeObject<DataSet>("{" + subResult.ToString() + "}");
if (ds.Tables[0].Columns.Contains(strTransferValue))
{
addTransfer[strTransferParName] = ds.Tables[0].Rows.Count > 0 ? ds.Tables[0].Rows[0][strTransferValue] : "";
break;
}
}
else if (strTransferValue == subResult.Name.ToUpper())
{
addTransfer[strTransferParName] = subResult.Value.ToString();
break;
}
}
}
}
}
}
/// <summary>
/// 2020/07/31,處理Ref類型參數
/// </summary>
/// <param name="jObj"></param>
/// <param name="pars"></param>
/// <param name="index"></param>
public static void PorcessRef(ref JObject jObj, object[] pars, Dictionary<short, string> index)
{
if (index == null || pars == null)
return;
for (int i = 0, loopTo = pars.Length - 1; i <= loopTo; i++)
{
try
{
if (pars[i] == null)
continue;
if (ReferenceEquals(pars[i].GetType(), typeof(DataSet)))
{
DataSet dsTemp = pars[i] as DataSet;
ColumnName_ToUpper(dsTemp);
pars[i] = dsTemp;
}
else if (ReferenceEquals(pars[i].GetType(), typeof(DataTable)))
{
DataTable dtTemp = pars[i] as DataTable;
ColumnName_ToUpper(dtTemp);
pars[i] = dtTemp;
}
}
catch (Exception ex)
{
Log.WriteLog("PorcessRef fail:DataTable Upper" + i, iMESLog.iMESLogLevel.Warn, ex);
}
}
string key = "";
foreach (short i in index.Keys)
{
try
{
key = "";
key = index[i];
var p = jObj.Property(index[i]);
if (!(p == null))
continue;
jObj.Add(key, Newtonsoft.Json.Linq.JToken.Parse(JsonConvert.SerializeObject(pars[i])));
}
catch (Exception ex)
{
Log.WriteLog("PorcessRef fail:" + key, iMESLog.iMESLogLevel.Warn, ex);
}
}
}
/// <summary>
/// 2020/07/28 雋辰,parameter convert to XML
/// </summary>
/// <param name="dic">parameter</param>
/// <returns></returns>
public static string Parameter2XML(Dictionary<string, object> dic, Dictionary<string, object> t_global = null, Dictionary<string, object> t_single = null)
{
string result = "";
try
{
foreach (string key in dic.Keys)
{
try
{
if (dic[key] == null)
continue;
if (key.ToLower() == "additional")
{
result += dic[key];
}
else if (dic[key].GetType() == typeof(Newtonsoft.Json.Linq.JArray))
{
try
{
// 20210513 13871,MantisBT:0092632,DataTable轉型傳入自定義JsonConvert方式,排除浮點數被轉成整數問題
JsonSerializerSettings settings = new JsonSerializerSettings() { Converters = new[] { new TypeInferringDataTableConverter() } };
DataTable dt = JsonConvert.DeserializeObject<DataTable>(dic[key].ToString(), settings);
string tmpXml = "";
string tmpVal = "";
foreach (DataRow row in dt.Rows)
{
tmpVal = "";
foreach (DataColumn col in dt.Columns)
{
if (col.ColumnName.Contains("$$hashKey"))
continue; // 20211202 13871,排除$$hasekey
// 20211228 13871,值進行CInput處理
tmpVal += CombineXMLValue(col.ColumnName.ToLower(), CInput(row[col.ColumnName].ToString()));
}
tmpXml += CombineXMLValueTag(tmpVal);
}
string argvalue_name = key.ToString();
string argname = key.ToString();
string argtype = "String";
string argdesc = "";
result += CombineXMLParameterMultiValue(argvalue_name, argname, argtype, tmpXml, argdesc);
}
catch (Exception ex)
{
Log.WriteLog(key + ":Parameter2XML fail", iMESLog.iMESLogLevel.Warn, ex);
// 20210513 13871,轉型錯誤直接回傳前端
throw;
}
}
else if (string.IsNullOrEmpty(dic[key].ToString()))
{
string argname1 = key.ToString();
string argtype1 = dic[key].GetType().Name;
string argdesc1 = "";
result += CombineXMLParameter_Space(argname1, argtype1, argdesc1);
}
else
{
// 20211228 13871,值進行CInput處理
result += CombineXMLParameter(key.ToString(), dic[key].GetType().Name, CInput(dic[key].ToString()), "");
}
}
catch (Exception ex)
{
Log.WriteLog(key + ":" + ex.ToString(), iMESLog.iMESLogLevel.Warn, ex);
// 20210513 13871,轉型錯誤直接回傳前端
throw;
}
}
if (!(t_single == null))
{
foreach (string key in t_single.Keys)
{
if (t_single[key].GetType().Equals(typeof(DataTable)))
{
try
{
DataTable dt = t_single[key] as DataTable;
string tmpXml = "";
string tmpVal = "";
foreach (DataRow row in dt.Rows)
{
tmpVal = "";
foreach (DataColumn col in dt.Columns)
{
string argTagName1 = col.ColumnName.ToLower();
string argValue1 = row[col.ColumnName].ToString();
tmpVal += CombineXMLValue(argTagName1, argValue1);
}
tmpXml += CombineXMLValueTag(tmpVal);
}
string argvalue_name1 = key.ToString();
string argname3 = key.ToString();
string argtype3 = "String";
string argdesc3 = "";
result += CombineXMLParameterMultiValue(argvalue_name1, argname3, argtype3, tmpXml, argdesc3);
}
catch (Exception ex)
{
Log.WriteLog("Parameter2XML fail", iMESLog.iMESLogLevel.Warn, ex);
}
}
else if (string.IsNullOrEmpty(t_single[key].ToString()))
{
string argname4 = key.ToString();
string argtype4 = t_single[key].GetType().Name;
string argdesc4 = "";
result += CombineXMLParameter_Space(argname4, argtype4, argdesc4);
}
else
{
string argname5 = key.ToString();
string argtype5 = t_single[key].GetType().Name;
string argvalue1 = t_single[key].ToString();
string argdesc5 = "";
result += CombineXMLParameter(argname5, argtype5, argvalue1, argdesc5);
}
}
}
if (!(t_global == null))
{
foreach (string key in t_global.Keys)
{
if (t_single != null && t_single.ContainsKey(key))
continue;
if (t_global[key].GetType().Equals(typeof(DataTable)))
{
try
{
DataTable dt = t_global[key] as DataTable;
string tmpXml = "";
string tmpVal = "";
foreach (DataRow row in dt.Rows)
{
tmpVal = "";
foreach (DataColumn col in dt.Columns)
{
string argTagName2 = col.ColumnName.ToLower();
string argValue2 = row[col.ColumnName].ToString();
tmpVal += CombineXMLValue(argTagName2, argValue2);
}
tmpXml += CombineXMLValueTag(tmpVal);
}
string argvalue_name2 = key.ToString();
string argname6 = key.ToString();
string argtype6 = "String";
string argdesc6 = "";
result += CombineXMLParameterMultiValue(argvalue_name2, argname6, argtype6, tmpXml, argdesc6);
}
catch (Exception ex)
{
Log.WriteLog("Parameter2XML fail", iMESLog.iMESLogLevel.Warn, ex);
}
}
else if (string.IsNullOrEmpty(t_global[key].ToString()))
{
string argname7 = key.ToString();
string argtype7 = t_global[key].GetType().Name;
string argdesc7 = "";
result += CombineXMLParameter_Space(argname7, argtype7, argdesc7);
}
else
{
string argname8 = key.ToString();
string argtype8 = t_global[key].GetType().Name;
string argvalue2 = t_global[key].ToString();
string argdesc8 = "";
result += CombineXMLParameter(argname8, argtype8, argvalue2, argdesc8);
}
}
}
}
catch (Exception ex)
{
throw;
}
return result;
}
#region Combine Response
/// <summary>
/// 2020/04/22 雋辰,取得RsponseMessage的json string
/// </summary>
/// <param name="response"></param>
/// <param name="ex">例外狀況</param>
/// <param name="language">語系</param>
/// <returns></returns>
public static string CombineRsponseMessage(iMESCIO.CDO.Common.RsponseMessage response = null, Exception ex = null, string language = "", string stack = "", string resourceDir = "Resource")
{
if (response == null)
response = new iMESCIO.CDO.Common.RsponseMessage();
try
{
if (!(ex == null))
{
response.Code = Get_Exception_Code(ex);
response.CodeInformation = Convert.ToString(Translate_iMESCode(response.Code, language));
response.Exception = Convert.ToString(Get_Exception_Type(ex));
response.Message = TranslateMsg(Convert.ToString(Get_Exception_Message(ex)), language, resourceDir);
if (string.IsNullOrEmpty(stack))
{
response.StackTrace = Convert.ToString(Get_Exception_StackTrace(ex));
}
else
{
response.StackTrace = stack;
}
}
}
catch (Exception e)
{
Exception tmpEx = (Exception)Activator.CreateInstance(e.GetType(), new object[] { e.Message, ex });
response.Code = "0000-200091";
response.CodeInformation = Convert.ToString(Translate_iMESCode(response.Code, language));
response.Exception = Convert.ToString(Get_Exception_Type(tmpEx));
string argstrInput = Convert.ToString(Get_Exception_Type(tmpEx));
response.Message = CInput(argstrInput);
string argstrInput1 = Convert.ToString(Get_Exception_StackTrace(tmpEx));
response.StackTrace = CInput(argstrInput1);
}
return response.SerializeObjectData();
}
/// <summary>
/// 2020/04/22 雋辰,取得"ex"內含所有Exception的訊息
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public static object Get_Exception_Message(Exception ex)
{
string result = "";
var tmpEx = new Exception(ex.Message, ex);
while (!(tmpEx.InnerException == null))
{
result += tmpEx.InnerException.Message + ";";
tmpEx = tmpEx.InnerException;
}
return result;
}
/// <summary>
/// 2020/04/22 雋辰,取得"ex"內含所有Exception的例外堆疊資訊
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public static object Get_Exception_StackTrace(Exception ex)
{
string result = "";
var tmpList = new List<string>();
string divider = "----- 內部例外狀況堆疊追蹤的結尾 ---";
var tmpEx = new Exception(ex.Message, ex);
while (!(tmpEx.InnerException == null))
{
tmpList.Add(tmpEx.InnerException.StackTrace);
tmpList.Add(divider);
tmpEx = tmpEx.InnerException;
}
if (tmpList[tmpList.Count - 1] == divider)
tmpList.RemoveAt(tmpList.Count - 1);
for (int i = 0, loopTo = tmpList.Count - 1; i <= loopTo; i++)
{
result += tmpList[i];
if (i < tmpList.Count - 1)
result += Constants.vbCrLf;
}
return result;
}
/// <summary>
/// 2020/04/22 雋辰,取得"ex"內含所有Exception的類別
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public static object Get_Exception_Type(Exception ex)
{
string result = "";
var tmpList = new List<string>();
string divider = "--- 內部例外 ---";
var tmpEx = new Exception(ex.Message, ex);
while (!(tmpEx.InnerException == null))
{
tmpList.Add(tmpEx.InnerException.GetType().ToString());
tmpList.Add(divider);
tmpEx = tmpEx.InnerException;
}
if (tmpList[tmpList.Count - 1] == divider)
tmpList.RemoveAt(tmpList.Count - 1);
for (int i = 0, loopTo = tmpList.Count - 1; i <= loopTo; i++)
{
result += tmpList[i];
if (i < tmpList.Count - 1)
result += Constants.vbCrLf;
}
return result;
}
/// <summary>
/// 2020/05/22 雋辰,取出iMES Code
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public static string Get_Exception_Code(Exception ex)
{
string code = "0000-200091";
var tmpEx = new Exception(ex.Message, ex);
while (!(tmpEx.InnerException == null))
{
if (tmpEx.InnerException is iMESException.MESException)
{
code = Convert.ToString((tmpEx.InnerException as iMESException.MESException).ErrorCode);
break;
}
tmpEx = tmpEx.InnerException;
}
return code;
}
#endregion
}
internal class iMES_ResponseMessage
{
public string code { get; set; }
public string exception { get; set; }
public string message { get; set; }
public string stacktrace { get; set; }
public string CombineRsponseMessage(iMES_ResponseMessage oResponseMsg, string LanguageMode, string resourceDir = "Resource")
{
try
{
if (oResponseMsg.code != "0")
{
string argstrInput = TranslateMsg(oResponseMsg.exception, LanguageMode, resourceDir);
oResponseMsg.exception = CInput(argstrInput);
}
}
catch (Exception ex)
{
oResponseMsg.code = "0000-999999";
oResponseMsg.exception = ex.Message;
oResponseMsg.message = ex.Message;
oResponseMsg.stacktrace = ex.StackTrace;
}
return JsonConvert.SerializeObject(oResponseMsg);
}
}
}