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 > )
{
string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[]["UserGuid"].ToString(), dv[]["displayname"].ToString(), dv[]["ouguid"].ToString(), dv[]["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);
}
}
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 = ; 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 > )
{
string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[]["UserGuid"].ToString(), dv[]["displayname"].ToString(), dv[]["ouguid"].ToString(), dv[]["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---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>年份,1000至9999字符串。(☆注意必须是四位)</Year> <Month>月份,01至12字符串。(☆注意必须是两位)</Month> <MainContent>督学计划内容</MainContent> </paras> |
|||
|
输入参数详细 |
参数名称 |
参数说明 |
类型 |
是否必填 |
|
UserGuid |
当前用户UserGuid |
字符型 |
是 |
|
|
Year |
所选择年份Year |
字符型 |
是 |
|
|
Month |
月份,01至12字符串 |
字符型 |
是 |
|
|
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格式返回值的一种方式的更多相关文章
- php 如何利用 soap调用.Net的WebService asmx文件
原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...
- ASP.NET页面之间传递值的几种方式(转载)
页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...
- ASP中页面之间传递值的几种方式
ASP.NET页面之间传递值的几种方式 页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryS ...
- 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD
使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...
- WebService 实现BS环境与BS环境传递参数,根据参数生成txt文档
客户端: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Client.as ...
- linux使用curl上传文件并且同时携带其它传递参数
一般使用linux原生态的命令curl上传文件时命令如下 假如要上传文件是myfile.txt curl -F "file_name=@myfile.txt" -X POST &q ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的图像采集格式Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别
简单来说,YUV: luma (Y) + chroma (UV) 格式, 一般情况下sensor支持YUV422格式,即数据格式是按Y-U-Y-V次序输出的RGB: 传统的红绿蓝格式,比如RGB565 ...
- 关于form表单提交数据后不跳转页面+ajax接收返回值的处理
1.前台的form表单建立,注意action.enctype的内容, 2.通过添加一个隐藏的iframe标签使form的target指向iframe来达到不跳转页面的效果,同时需要在js里获取ifra ...
- ASP.NET页面之间传递值的几种方式
目录 QueryString Session Cookie Application 一.QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中. ...
随机推荐
- mxonline实战15,用户中心:我的课程, 我的收藏,我的消息,登出和点击数以及收藏数
对应github地址:第15天 一. 我的课程 1. 继承usercenter-base页面 2. 编写url, view
- 移动端<meta>属性配置讲解(整理)
meta标签,是head区的辅助标签 HTML代码如下: <meta charset="utf-8"><meta http-equiv="X-UA-Co ...
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(下)
上文我们讨论了PostgreSQL的MVCC相关的基础知识以及实现机制.关于PostgreSQL中的MVCC,我们只讲了元组可见性的问题,还剩下两个问题没讲.一个是"Lost Update& ...
- 爬虫之chrome浏览器的使用方法
chrome浏览器使用方法介绍 1. 新建隐身窗口 1.1 为什么需要新建隐身窗口 在打开隐身窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,不携带cookie.这样就 ...
- 【kuangbin】计算几何部分最新模板
二维几何部分 // `计算几何模板` ; const double inf = 1e20; const double pi = acos(-1.0); ; //`Compares a double t ...
- github常用项目汇总
1.smartTable(智能表格) android自动生成表格框架 使用方法:在github中搜索smartTable 进入项目后,查看开源项目的介绍和使用方法即可.
- Docker 入门相关
什么是Docker和容器 可能是把Docker的概念讲的最清楚的一篇文章 为什么要用Docker 相关网址 Window平台Docker下载 一些基本知识 Volume docker volume l ...
- C#面试:委托
面试常见题: 1.委托是什么?★☆ 2.为什么需要委托?★☆ 3.委托能用来做什么?★☆ 4.如何自定义委托★☆ 5..NET默认的委托类型有哪几种?★☆ 6.怎样使用委托?★★★ 7.多播委托是什么 ...
- Linux下mysql基础命令(一)
1, 创建mysqld数据库的管理用户: 要把root用户设置为管理员,我们应该运行下面的命令: # mysqladmin -u root password 密码 一般情 ...
- Git学习系列之Git基本操作推送项目(图文详解)
前面博客 Git学习系列之Git基本操作提交项目(图文详解) 如果完成到一定程度,那么可以推送到远端在线仓库. 推送之前,请确保你已经设置了全局的 user.name 和 user.email, 如果 ...