zoukankan      html  css  js  c++  java
  • 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:浏览器中测试的结果

  • 相关阅读:
    VPC/VM/VBOX安装GHOST版的无法启动系统
    在虚拟机中使用Ghost系统盘安装
    用vmware安装gho文件心得
    VC中Error spawning cl.exe错误的解决方法.
    C语言屏幕打印,再删除打印的内容
    bat根据星期启动程序
    ARP命令详解
    bat生成vbs通过注册表禁用或启用USB端口
    OracleDesigner学习笔记1――安装篇
    MarkMonitor 目前最安全的域名注册商,因此,世界500强网站中的22%域名托管于markmonitor公司
  • 原文地址:https://www.cnblogs.com/weity/p/5590633.html
Copyright © 2011-2022 走看看