SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML命名空间(namespace)中,这样使得定义更加简单。
B/S架构的软件,客户端对数据流的处理能力较弱,C/S架构的软件,又在数据库的集中处理上有点不不方便,尤其是,业务逻辑层有改变时,得重新安装客户端软件。
针对B/S和C/S的不足,笔者在开发中,尝试采用B/S + C/S混合模式开发,受益多多。现在拿出来与大家一起分享。
整个系统结构如下:
[WinForm] ---------XML Request------>Webservice -------Http Post---->[aspx/php/jsp/cgi] ----DB(MSSQL2000/2005)
在整个系统运作中,WebService 起到中间桥梁作用。它负责把WinForm的Xml请求包解析,然后调用相应的aspx页面进行处理。
WinForm ------ 界面层
aspx/php/jsp/cgi ---- 业务处理层
DB -----数据库实体
Request XML 协议介绍
<Form Name=[FormName] ID=[FormID]
Action=[URL] Method=[Method]>
<Descript>
<!--
表单头部说明
-->
</Descript>
<DATA>
<!
—
表单数据区
-->
<Item Name=[ItemName] ID=[ItemID]/>
<DATA>
</Form> |
在我们的1.0Request XML 规范中,我们把界面层传递到WebService层的数据分为2类,1种是描述(Descript)类数据,1种是数据(DATA)类数据。
Name :提供WebService 进行数据识别,ID 与 Name相同,主要是考虑name重名的问题
Action : URL ,对该请求包,进行分析处理的aspx页面(也可以php/jsp/cgi)等
Method:等价于Html的 Post / Get
业务处理层数据处理原理
以aspx为例:
<%@ Page Language="C#" ValidateRequest="false" %> <% string xmlDescript; System.Xml.XmlDocument xd_Descript = new System.Xml.XmlDocument(); bool b_Descript_Request = false; bool b_xml_Descript = false;
sb.Append("<Return>"); xmlDescript = Request.Form["Descript"].ToString(); //表单描述部分 b_Descript_Request = true; //描述体 请求成功 xmlData = Request.Form["Data"].ToString(); xd_Descript.LoadXml(xmlDescript); xd_Data.LoadXml(xmlData); sb.Append("<DescriptRequest>" + b_Descript_Request.ToString() + "</DescriptRequest>"); sb.Append("</Return>"); //数据返回 |
aspx页面,接收到来自 WebService的Http请求,经过对数据的处理加工,然后通过调用asp.NET的Response方法,把处理结果重写回WebService,然后WebService再把处理的数据封装打回到WinForm。
WebService动态调用aspx/jsp/php/cgi说明
WebService根据WinForm传入的ID和URL,进行调用。
[1]URL参数为空,则自动根据ID查询 config,xml配置文件,进行URL请求
[2]URL参数不为空,直接请求
下面以我们实际开发中使用的一个配置文件,提供大家参考。
<?xml version="1.0" encoding="utf-8" ?> <YC_WebService> <!--出库管理-->
<!--模型管理 End--> </Form> <!--序列号 获取 Begin--> <ACT_GET_DD_ID URL="http://localhost:1401/do/sys/GetSnNumberID.aspx?SeedType=101&firstName=DD" detail="获取订单单号"/> |
如何在WebService 中调用一个aspx页面呢?这也许是一个大家所关心的话题。下面给出一段代码大家参考。我想大家一看就会明白的。
public string HttpPost(string strURL, string paraUrlCoded) XmlDocument xd = new XmlDocument(); System.Net.HttpWebRequest request; /* byte[] payload; // System.Net.HttpWebResponse response; Stream stream = response.GetResponseStream(); } } return sb.ToString(); |
string strURL, ---- aspx页面调用的URL, 也可以是jsp/php/cgi 的调用路径 string paraUrlCoded --- 传递到asp/jsp/php/cgi的参数。 采用UrlEncode 重新编码。(这里和前面的 Methhod对应) |
说道这里,也累了,我想大家应该可以明白整个流程了吧。(未完待续)换迎来信交流 bohegod@163.com 或登录我们的网站http://www.yunfly.com