WebService,ASMX文件使用XML格式數據傳遞參數、驗證與獲取XML格式返回值的一種方式

1:首先WebService方法定義,每一個方法定義兩個參數,一個用於驗證權限,string格式的XML文本用於傳輸數據。最終目的實現,WebService方法,驗證權限,獲取XML數據,處理以後返回XML數據。一下面一段代碼爲例進行說明:node

 [WebMethodAttribute(Description = "新增督學計劃")]
        public string InspectorPlan_Add(string Token, string XMLParas)
        {

            try
            {
                //安全憑證檢查
                if (!TokenAuth.Check(Token))
                {
                    //爲了測試方便先註釋掉
                    //return this.GetResult(false, "安全憑證無效!", "");
                }
                Hashtable paras = GetParametersFromXML(XMLParas);
                //檢查參數是否存在
                string msg = this.CheckParas("InspectorGuid,Year,Month,MainContent", paras);
                if (msg != "")
                {
                    return GetResult(false, msg, "", "InspectorPlan_Add", XMLParas);
                }
                string UserGuid = paras["InspectorGuid"].ToString(); //用戶UserGuid
                string Year = paras["Year"].ToString();//傳過來的月份
                string Month = paras["Month"].ToString();//傳過來的月份
                string MainContent = paras["MainContent"].ToString();//傳過來的計劃內容
                //根據UserGuid獲取用戶所在部門名稱,所在部門Guid,用戶姓名
                string UserInfoSql = "select a.userguid,a.displayname,b.ouguid,b.ouname from frame_user a join frame_ou b on a.ouguid = b.ouguid where a.userguid ='" + UserGuid + "'";
                //查詢該月督學計劃是否存在,存在則不能重複插入
                if (DB_XXTInspectorPlan.InspectorPlan_CheckExist(UserGuid, Year, Month))
                {
                    //若是該月已經存在,則提示月度督學計劃重複
                    return GetResult(false, "月度督學計劃重複", "", "AddInspectorPlan", XMLParas);
                }
                else
                {
                    DataView dv = Epoint.EduFront.Bizlogic.DB_Common.ExecuteToDataView(UserInfoSql);

                    if (dv.Count > 0)
                    {
                        string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[0]["UserGuid"].ToString(), dv[0]["displayname"].ToString(), dv[0]["ouguid"].ToString(), dv[0]["ouname"].ToString(), MainContent, Year, Month);
                        //評價成功,返回評價的rowguid
                        return GetResult(true, "添加成功", "<RowGuid>" + RowGuid + "</RowGuid>", "AddInspectorPlan", XMLParas);
                    }
                    else
                    {
                        return GetResult(false, "", "<RowGuid>添加失敗</RowGuid>", "ParEvaSchInsert", XMLParas);
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorLog("AddInspectorPlan", XMLParas, ex.Message);
                return GetResult(false, ex.Message, "", "AddInspectorPlan", XMLParas);
            }
        }
View Code

2:Token參數用於驗證權限,XMLParas用於傳遞string格式的XML數據瀏覽器

此方法須要傳遞的參數以下:安全

<?xml version="1.0" encoding="gb2312" ?>

<paras>

  <InspectorGuid>當前用戶UserGuid</InspectorGuid>

 <Year>年份,1000至9999字符串。(☆注意必須是四位)</Year>

  <Month>月份,01至12字符串。(☆注意必須是兩位)</Month> 

  <MainContent>督學計劃內容</MainContent>

</paras> 

3:循環解析每一個節點獲取對應的參數值,Hashtable paras = GetParametersFromXML(XMLParas);該語句調用解析XML字符串並轉化參數到HashTable中ide

GetParametersFromXML方法以下:測試

Hashtable paras = GetParametersFromXML(XMLParas);
public Hashtable GetParametersFromXML(string XMLParameters)
        {
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(XMLParameters);
            XmlNode DataNode = xml.SelectSingleNode("paras");

            Hashtable Parameters = new Hashtable();
            foreach (XmlNode node in DataNode.ChildNodes)
            {
                Parameters.Add(node.Name, node.InnerText);
            }
            return Parameters;
        }

4:檢查必填參數是否存在,並對缺乏的參數給出提示。checkParas方法,用於檢測每一個參數。實現代碼以下:ui

 //檢查參數是否存在,第一個值爲必填參數節點名稱,每一個參數用","隔開
                string msg = this.CheckParas("InspectorGuid,Year,Month,MainContent", paras);
/// <summary>
        /// 檢查是否缺乏參數必填參數
        /// </summary>
        /// <param name="Parastr">參數名稱,多個參數用逗號隔開</param>
        /// <param name="Paras">獲取到參數Hastable</param>
        /// <returns></returns>
        public string CheckParas(string Parastr, Hashtable Paras)
        {
            string[] listParas = Parastr.Split(',');
            string Error = "";
            for (int i = 0; i < listParas.Length; i++)
            {
                if (listParas[i] != "")
                {
                    if (!Paras.ContainsKey(listParas[i]))
                    {
                        Error += listParas[i] + ",";
                    }
                }
            }

            if (Error != "")
            {
                return "缺乏參數:" + Error.TrimEnd(',');
            }
            else
            {
                return "";
            }

        }

5:確認必填參數存在後獲取對應的參數值,進行操做,每一個XML參數的節點名稱做爲hashtable的name,每一個節點的值做爲nodevalue,根據nodename獲取參數值代碼this

 

 string UserGuid = paras["InspectorGuid"].ToString(); //用戶UserGuid
                string Year = paras["Year"].ToString();//傳過來的月份
                string Month = paras["Month"].ToString();//傳過來的月份
                string MainContent = paras["MainContent"].ToString();//傳過來的計劃內容

6:參數的返回,對獲取的數據處理後,把須要返回的數據用拼接爲XML格式的字符串返回。spa

 string UserInfoSql = "select a.userguid,a.displayname,b.ouguid,b.ouname from frame_user a join frame_ou b on a.ouguid = b.ouguid where a.userguid ='" + UserGuid + "'";
                //查詢該月督學計劃是否存在,存在則不能重複插入
                if (DB_XXTInspectorPlan.InspectorPlan_CheckExist(UserGuid, Year, Month))
                {
                    //若是該月已經存在,則提示月度督學計劃重複
                    return GetResult(false, "月度督學計劃重複", "", "AddInspectorPlan", XMLParas);
                }
                else
                {
                    DataView dv = Epoint.EduFront.Bizlogic.DB_Common.ExecuteToDataView(UserInfoSql);

                    if (dv.Count > 0)
                    {
                        string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[0]["UserGuid"].ToString(), dv[0]["displayname"].ToString(), dv[0]["ouguid"].ToString(), dv[0]["ouname"].ToString(), MainContent, Year, Month);
                        //評價成功,返回評價的rowguid
                        return GetResult(true, "添加成功", "<RowGuid>" + RowGuid + "</RowGuid>", "AddInspectorPlan", XMLParas);
                    }
                    else
                    {
                        return GetResult(false, "", "<RowGuid>添加失敗</RowGuid>", "ParEvaSchInsert", XMLParas);
                    }
                }
public string GetResult(bool status, string description, string UserData, string MethodName, string XMLPars)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>");
            sb.Append("<EpointDataBody>");
            sb.Append("<DATA>");
            sb.Append("<ReturnInfo>");
            sb.Append("<Status>" + status.ToString() + "</Status>");
            sb.Append("<Description><![CDATA[" + description + "]]></Description>");
            sb.Append("</ReturnInfo>");
            if (status && UserData != "")
            {
                sb.Append("<UserArea>" + UserData + "</UserArea>");
            }
            sb.Append("</DATA>");
            sb.Append("</EpointDataBody>");

            //保存接口調用日誌
            //string ClientIP = Context.Request.ServerVariables.GetValues("REMOTE_ADDR")[0];
            //DB_XXTWebServiceLog.InsertLog(ClientIP, MethodName, System.Text.Encoding.Default.GetBytes(XMLPars), System.Text.Encoding.Default.GetBytes(sb.ToString()), status ? "1" : "0", description);

            return sb.ToString();
        }

7:最終實現返回的XML格式文本以下:3d

新增成功時返回插入行的RowGuid
<?xml version="1.0" encoding="gb2312"?>
<EpointDataBody>
<DATA><ReturnInfo><Status>True</Status><Description>
<![CDATA[插入成功]]>
</Description></ReturnInfo><UserArea>
<RowGuid>42ccaec8-9091-4950-a653-ecbb4328428c</RowGuid>
</UserArea>
</DATA>
</EpointDataBody>
一個月份重複插入時返回:
<EpointDataBody><DATA>
<ReturnInfo><Status>False</Status>
<Description><![CDATA[月度計劃重複]]>
</Description></ReturnInfo></DATA>
</EpointDataBody>

8:最後的也是最重要的一步造成文檔,以方便調用此方法的人進行開發。日誌

 

服務名稱

InspectorPlan_Add

服務說明

插入用戶所填寫的督學計劃信息

輸入值

<?xml version="1.0" encoding="gb2312" ?>

<paras>

  <InspectorGuid>當前用戶UserGuid</InspectorGuid>

 <Year>年份,10009999字符串。(☆注意必須是四位)</Year>

  <Month>月份,0112字符串。(☆注意必須是兩位)</Month>

  <MainContent>督學計劃內容</MainContent>

</paras> 

 

輸入參數詳細

參數名稱

參數說明

 類型

是否必填

UserGuid

當前用戶UserGuid

字符型

Year

所選擇年份Year

字符型

Month

月份,0112字符串

字符型

MainContent

計劃內容

字符型

返回值

新增成功時返回插入行的RowGuid

<?xml version="1.0" encoding="gb2312"?>

<EpointDataBody>

<DATA><ReturnInfo><Status>True</Status><Description>

<![CDATA[插入成功]]>

</Description></ReturnInfo><UserArea>

<RowGuid>42ccaec8-9091-4950-a653-ecbb4328428c</RowGuid>

</UserArea>

</DATA>

</EpointDataBody>

一個月份重複插入時返回:

<EpointDataBody><DATA>

<ReturnInfo><Status>False</Status>

<Description><![CDATA[月度計劃重複]]>

</Description></ReturnInfo></DATA>

</EpointDataBody>

 

 

9:瀏覽器中測試的結果

相關文章
相關標籤/搜索