close

最近因要與.net framework 4 web進行串接,因舊專案都使用WCF進行資料共享,故在不想調整舊程式為Webapi時,就會需要進行WCF的套用

而.net core在進行服務連接時,因原本回傳為Datatable形式,故在進行程式碼自動建立時,會將回傳資訊轉成xml格式進行回傳

這裡就會需要再由xml轉回Datatable的形式

首先是增加WCF Web服務,路徑在 專案/加入/連線服務

在來放入該WCF的服務網址,看到的應該是這樣

螢幕擷取畫面 2022-05-24 205258

在把這個網址貼到URL中,在點選 移至,如果服務正常應該就會看到公開出來的一些方法,記得要調整命名空間

螢幕擷取畫面 2022-05-24 205039

再來是呼叫WCF範例,原本需傳入

statuClass物件與edition字串,分別成了兩行動作,或可以在建立時一併建立

所有的要丟入的參數系統都會建立在GetChargeDataRequest中

要請WCF Server端回應,則要使用GetChargeDataAsync並傳入參數Request即可

接下來只要收到到GetChargeDataResult結果後,取得裡面的Any1,就可以開始轉換回Datatable囉!

 

[HttpGet("CallWcfSample")]
        async public Task<ActionResult<string>> CallWcfSample()
        {
            DataTable dt = new DataTable();

            try
            {
                var req = new CPServiceReference.GetChargeDataRequest();
                req.q = new CPServiceReference.statuClass { statu = true };
                req.edition = "2022W07";

                CPServiceReference.GetChargeDataResponse res = await _CPserviceClient.GetChargeDataAsync(req);

                var www = res.GetChargeDataResult;

                dt = _DataTableAPI.ConvertXmlElementToDataTable(www.Any1, "ChargeData");


            }
            catch (Exception ex)
            {
                throw ex;

            }



            return Newtonsoft.Json.JsonConvert.SerializeObject(dt);

        }

 

public DataTable ConvertXmlElementToDataTable(XmlElement xmlElement, string tagName)
        {
            XmlNodeList xmlNodeList = xmlElement.GetElementsByTagName(tagName);

            DataTable dt = new DataTable(tagName);
            int TempColumn = 0;
            if (xmlNodeList.Count <= 0)
            {
                return dt;
            }
            foreach (XmlNode node in xmlNodeList.Item(0).ChildNodes)
            {
                TempColumn++;
                DataColumn dc = new DataColumn(node.Name, System.Type.GetType("System.String"));
                if (dt.Columns.Contains(node.Name))
                {
                    dt.Columns.Add(dc.ColumnName = dc.ColumnName + TempColumn.ToString());
                }
                else
                {
                    dt.Columns.Add(dc);
                }
            }
            int ColumnsCount = dt.Columns.Count;
            for (int i = 0; i < xmlNodeList.Count; i++)
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < ColumnsCount; j++)
                {
                    if (xmlNodeList.Item(i).ChildNodes[j] != null)
                        dr[j] = xmlNodeList.Item(i).ChildNodes[j].InnerText;
                    else
                        dr[j] = "";
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
arrow
arrow

    cs60811 發表在 痞客邦 留言(0) 人氣()