WebService,ASMX文件使用XML格式数据传递参数验证与获取XML格式返回值的一种方式

Posted 一天,又一天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebService,ASMX文件使用XML格式数据传递参数验证与获取XML格式返回值的一种方式相关的知识,希望对你有一定的参考价值。

1:首先WebService方法定义,每个方法定义两个参数,一个用于验证权限,string格式的XML文本用于传输数据。最终目的实现,WebService方法,验证权限,获取XML数据,处理之后返回XML数据。一下面一段代码为例进行说明:

 [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中

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方法,用于检测每个参数。实现代码如下:

 //检查参数是否存在,第一个值为必填参数节点名称,每个参数用","隔开
                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获取参数值代码

 

 string UserGuid = paras["InspectorGuid"].ToString(); //用户UserGuid
                string Year = paras["Year"].ToString();//传过来的月份
                string Month = paras["Month"].ToString();//传过来的月份
                string MainContent = paras["MainContent"].ToString();//传过来的计划内容

6:参数的返回,对获取的数据处理后,把需要返回的数据用拼接为XML格式的字符串返回。

 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格式文本如下:

新增成功时返回插入行的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:浏览器中测试的结果

 

以上是关于WebService,ASMX文件使用XML格式数据传递参数验证与获取XML格式返回值的一种方式的主要内容,如果未能解决你的问题,请参考以下文章

ASMX webservice - 返回 JSON 而不是 XML

asmx Web ServiceWeb API

asmx Web ServiceWeb API

java 调用webservice接口(asmx)

关于java调用.asmx文件

WebService-asmx后缀接口调用