7.2. 添加暴露为web services的端口... 13
一. 任务描述
做一个简单的例子,主要用到biztalk的sql适配器来从sql services中获取数据,然后通过web services发布出去。
基本应用场景是,客户端引用发布的web services,生成代理类和相关方法,调用某个带参数方法,参数传送到web services,web services获得需要调用的web方法和参数,将他们再发送到biztalk,biztalk相关端口接收到参数送入业务流程,在流程中将参数送到biztalk的sql适配器对应的端口,通过sql适配器将参数送到sql server,sql server返回根据传入参数查询获得的结果返回到业务流程,结果又通过web services返回到发出请求的客户端。
此过程中还涉及到架构映射,假设数据库表的字段名是中文的,为了对外一致提供英文的字段名,在流程中增加一个架构映射步骤,将中文字段名映射为英文字段名。
二. 任务步骤
1. 建数据库表
这里的场景假设是从一个数据表中根据输入条件来返回符合条件的数据表,先建立一个例子的数据表,假设在本地sql server的zyzh数据库中建立一个有下列字段的数据表iecms,数据类型都是varchar(255),做本试验可以只建使用到的四个字段(经营者代码,经营者中文名称,法人或负责人,工商登记号即可):
2. 建立相应的存储过程
建立查询存储过程GetListIecmsSP,设定四个字段作为查询条件,返回符合条件的数据表如下:
ALTER PROCEDURE dbo.GetListIecmsSP
(
@jingyingzhedaima varchar(255) = '',
@jingyingzhezhongwenmingcheng varchar(255) = '',
@farenhuofuzeren varchar(255) = '',
@gongshangdengjihao varchar(255) = ''
)
AS
declare @sql as varchar(1000)
set @sql = 'select 经营者代码,经营者中文名称,法人或负责人,工商登记号 from iecms where 经营者代码like ''%' + @jingyingzhedaima + '%'''
set @sql = @sql + ' and 经营者中文名称like ''%' + @jingyingzhezhongwenmingcheng + '%'''
set @sql = @sql + ' and 法人或负责人like ''%' + @farenhuofuzeren + '%'''
set @sql = @sql + ' and 工商登记号like ''%' + @gongshangdengjihao + '%'''
set @sql = @sql + ' for xml auto,xmldata'
exec(@sql)
RETURN
注意:
这里的SQL的语句的最后加了“for xml auto”,这表示将返回的数据表转换成xml格式后输出,biztalk内部的消息传送都是xml的格式。这个功能需要sql server的支持xmlsql,sql server 2000和sql server 2005都支持xmlsql功能。
“,xmldata”这部分,表示在输出xml的结果之前,自动生成一个此xml对应的xsd的架构,这里使用xmldata是因为biztalk的sql 适配器向导需要sql返回的架构来生成xsd架构文件。一旦使用sql 适配器向导生成了端口类型和消息架构,需要将“,xmldata”这部分删除,实际获取数据时不需要附带有架构部分的内容。
3. 新建空biztalk项目
如图所示,新建一个空biztalk项目,同时创建解决方案的目录ZYZH_Solution,把biztalk项目至于解决方案之下,以便以后增加项目(本文后面会增加一个winform的测试项目,用以测试这个biztalk项目)。
4. sql 适配器向导生成端口类型和消息架构
新建项目后,在解决方案资源管理器中就会有个“zyzh_biztalk_project”的biztalk的空项目,运行sql 适配器向导:
在biztalk项目上点击右键,选“添加――添加生成的项”,弹出以下对话框
选择“添加适配器元数据”,点“添加”按钮。
在已注册的适配器中选择SQL的适配器(还可能有别的适配器),sql server和数据库指的是biztalk的配置数据库的位置,缺省指向本机biztalk的配置数据库,不用去改,下一步。
点击“设置”按钮,指定要访问的数据库的连接串,在此指定zyzh数据库,由于数据库在本机,选择windows认证。生成的连接串如上图所示。下一步
这里要指定向导生成的消息架构文件的目标命名空间(targetnamespace),简单的说,目标命名空间是使用这个架构生成的xml实例所需要指定的命名空间,如果xml实例指定的命名空间跟架构文件的目标命名空间不一致,则表示此xml实例不是这个架构文件所定义的。每个xsd架构需要有跟其他xsd架构不同的、唯一的目标命名空间。
端口类型选择发送类型,因为biztalk用这个端口向sql server发送数据请求,然后接收sql server返回的数据。
请求文档根元素名称:指定发送到sql server请求数据的xsd架构根元素名
相应文档根元素名称:指定sql server返回数据的xsd架构根元素名。
点击“下一步”。
本例中采用存储过程,选“存储过程”,点击“下一步”
这里指定前面写的那个存储过程,在“参数值”中显示的是这个存储过程使用的参数,在此可以输入一些参数的模拟值,sql 适配器向导使用这些模拟值在生成的xsd架构文件中加入一个注释节点,说明此存储过程的调用格式,没有实际意义。
点击“生成”按钮,生成相应脚本。
点击“下一步”完成。
完成sql适配器向导,此向导会在biztalk项目中添加两个文件:一个空的业务流程文件和一个xsd架构文件,还有生成了一个端口类型(请求-相应,跟sql server适配器对接交换数据的端口)和两个消息类型(一个请求消息类型,一个返回数据的消息类型)
5. 修改存储过程
将存储过程中那个“,xmldata”部分删除,然后保存存储过程。因为实际获取数据的过程是不需要sql server输出架构信息的。
6. 修改向导生成文件、端口、消息的名称
Biztalk项目中端口、消息等等比较多又复杂,如果都是用向导自动生成的名称很不清晰,容易造成混乱,一般需要开发者自己定义一套命名规则来理顺命名。
6.1. 修改业务流程命名
按照以下规则命名:业务流程odx文件的命名:存储过程名 + “_Flow”, 同时把业务流程的类型名也改成此名。
在解决方案资源管理器中将“BizTalk 业务流程.odx”改为“GetListIecmsSP_Flow.odx”.
双击“BizTalk 业务流程.odx”,会打开此空业务流程,同时在开发环境右边(跟解决方案资源管理器一起的位置)会出现一个“业务流程视图”面板,
改类型名:如图选中“业务流程属性”,然后点击下方“属性”标签,在属性面板里把此业务流程的“类型名”也改为“GetListIecmsSP_Flow”。
6.2. 修改架构文件名和类型名
按照以下规则命名:存储过程名 + “_Sch”, 同时把schema的类型名也改成此名。
在解决方案资源管理器中将向导生成的xsd文件名改为“GetListIecmsSP_Sch.xsd”。
然后选中“GetListIecmsSP_Sch.xsd”文件,点击下面的属性标签,在属性面板里把xsd文件的类型名改为:GetListIecmsSP_Sch
6.3. 修改消息类型命名
按以下规则命名:
请求部分的消息类型 : 存储过程名 + “_RequestMsgType”
返回部分的消息类型 : 存储过程名 + “_ResponseMsgType”
本项目有两个消息类型,一个请求的,一个返回的。在“业务流程视图”面板上展开“多部分消息类型”,可以看到这两个有sql适配器向导生成的消息类型,分别将它们改名为:
procedureRequest à GetListIecmsSP_RequestMsgType
procedureResponse à GetListIecmsSP_ResponseMsgType
这时会发现,这两个消息类型下的parameters前面都会多了个红色惊叹号,这是因为parameters表示多部分消息中的一个消息,应该对应一个.net类或者架构,前面我们修改了xsd的类型名,原来parameters指向xsd的类型也发生了变化,我们把它修改过来。
选中GetListIecmsSP_RequestMsgType下的parameters,点击属性标签,在属性面板中,点击类型旁边的下拉列表,在架构中选择“zyzh_biztalk_project.GetListIecmsSP_Sch.GetListIecmsSP_RequestRoot”,就是修改后的xsd架构中的请求根元素。
同样,修改GetListIecmsSP_ResponseMsgType下parameters的类型为“zyzh_biztalk_project.GetListIecmsSP_Sch.GetListIecmsSP_ResponseRoot”。
6.4. 修改端口类型命名
按以下规则命名:
一般端口类型命名: 存储过程名+ “_PortType”
端口类型中的操作命名: 存储过程名 + “_Method”
本项目有一个双向端口,向导自动生成的端口类型名为“SQLServiceExec”,将此端口类型名改为“GetListIecmsSP_PortType”
端口下面的操作一般对象类中的方法,把端口类型下的操作名“procedure”改成“GetListIecmsSP_Method”
下面的工作开始进行业务流程图的设计
双击GetListIecmsSP_Flow.odx打开sql适配器向导生成的空流程图。
7. 添加端口
这里添加的是逻辑端口,是biztalk中业务流程跟biztalk其他部分的接口,biztalk系统跟外界的实际接口是通过各种适配器来完成的,这种实际接口叫物理端口,逻辑端口需要跟物理端口绑定后才能跟外界通讯。
7.1. 添加跟sql server接口的端口
在左边工具箱中拖一个“端口”图形到业务流程右边的端口图面,系统会自动运行端口配置向导:
点击“下一步”
这里需要输入这个端口的名称,这是一般端口,命名规则为:存储过程名 + “_Port”。这里取名:
点击“下一步”
选择端口类型,这个端口是用来跟sql server进行接口的,用来向sql server发出请求并从sql server获得数据的端口,所以这里选择sql适配器向导生成的那个端口。
点击“下一步”
端口绑定,这里是指这个逻辑端口怎么跟物理端口进行绑定,同时指定的通讯方向。
这里通讯方向选“我将发送请求并接收响应”,因为还没有设置物理端口,端口绑定选“以后指定”。
点击“下一步”,完成向导。
7.2. 添加暴露为web services的端口
在业务流程图的左面的“端口图面”上拖放一个端口,自动启动端口配置向导,这个端口是作为生成web services的端口,命名规则为:存储过程名 + “_WebPort”。这里把这个端口命名为:“GetListIecmsSP_WebPort”。
点击“下一步”
Biztalk中每个端口都需要对应一个端口类型,这里我们为这个端口新建一个端口类型,这个端口是要作为web services,端口类型的命名规则:存储过程名 + “_WebPortType”,这里这个端口的类型名称命名为:“GetListIecmsSP_WebPortType”。
通讯模式选择“请求-响应”,因为作为web services的端口必须是先接收请求,然后返回结果。
访问限制选“公有 – 无限制”,要发布为web services的端口必须是公有的。
点击“下一步”
通讯方向选“我将接收请求并发送响应”
端口绑定选“以后指定”
点击“下一步”,完成向导。
现在的业务流程图看上去是这样的:
左边那个端口是作为web services的端口,其中的Operation_1是端口中的一个操作,一个端口可以有多个操作,对应到web services,一个操作就相当于一个WebMethod。根据通过web services发布的接收端口的操作命名: 存储过程名 + “_WebMethod”,这里在图中点击Operation_1,在属性面板中,把此操作的表示符改为:“GetListIecmsSP_WebMethod”
8. 新建英文字段的xsd架构
本例中的数据库表是用中文作为字段名,为了将返回的结果转为英文字段名,需要建一个跟中文字段名xsd对应的英文字段名的xsd。
在解决方案资源管理器中,选中“GetListIecmsSP_Sch.xsd”,复制此文件,并在此项目中粘贴,生成一个“GetListIecmsSP_Sch.xsd”文件的复件。将此复件名改成“GetListIecmsSP_Sch_En.xsd”,同时,类型名也改为“GetListIecmsSP_Sch_En”。
双击“GetListIecmsSP_Sch_En.xsd”,打开此文件,然后点击“属性”面板,将此文件的Target Namespace改为“http://zyzh.szbti.gov.cn/GetListIecmsSP_En”
在xml编辑器中左边的树型结构中,打开找到GetListIecmsSP_ResponseRoot――iecms,下面是四个返回的4个中文字段名“经营者代码,经营者中文名称,法人或负责人,工商登记号”,分别点击这四个节点,在属性窗口中Node Name中分别改成:
经营者代码 ―― jingyingzhedaima
经营者中文名称 ―― jingyingzhezhongwenmingcheng
法人或负责人 ―― farenhuofuzeren
工商登记号 ―― gongshangdengjihao
如下图:
9. 添加消息
Biztalk的业务流程是以消息的传递为基础的,而biztalk内部的消息都是基于xml的数据,消息可以是基于.net的类,比如xmlDocument;多部分消息类型,比如前面sql适配器向导生成的多部分消息类型;xsd的架构等等。
在流程中需要先定义流程中使用到的消息。本项目需要使用四个消息。
消息的命名规则:
请求部分的消息类型 : 存储过程名 + “_RequestMsg”
返回部分的消息类型 : 存储过程名 + “_ResponseMsg”
9.1. 请求数据消息
在“业务流程视图”面板中,在“消息”上点击右键,选“新建消息”。
在消息下面多了一个“Message_1”,选择“Message_1”,切换到属性面板,将此消息的标识改为:“GetListIecmsSP_RequestMsg”,消息类型选多部分消息类型中的“zyzh_biztalk_project.GetListIecmsSP_RequestMsgType”,这个消息类型就是sql 适配器向导生成的xsd中请求数据的部分。
9.2. 返回数据消息
添加一个消息,标识为“GetListIecmsSP_ResponseMsg”,消息类型选多部分消息类型中的“zyzh_biztalk_project.GetListIecmsSP_ResponseMsgType”,这个消息类型就是sql 适配器向导生成的xsd中返回数据的部分。
9.3. 转换为英文字段的消息
添加一个消息,标识为“GetListIecmsSP_ResponseMsg_En”,消息类型选前面新建的英文字段xsd架构中的“zyzh_biztalk_project.GetListIecmsSP_Sch_En.GetListIecmsSP_ResponseRoot”
9.4. 转成XmlDocument的消息
添加一个消息,标识为“Message_xml”,消息类型选.net类中的“System.Xml.XmlDocument”,这个消息就是最后返回到请求客户端的消息类型。
10. 添加业务流程图中的处理流程
现在开始业务流程的设计
10.1. 添加接收图形
在工具箱中拖拉一个接收图形放置到业务流程图的绿色开始点和红色结束点之间,在属性面板中做如下设置:
名称:接受缺省的名称“Receive_1”,不需要改。
激活:True ,第一个接收图形的激活一定要设为True,以后再添加的接收图形都设为False。
消息:在下来框中选择“GetListIecmsSP_RequestMsg”
10.2. 添加其他接收发送图形
在上面的接收图形下再分别添加一个发送图形和接收图形
发送图形
名称:接受缺省的名称“Send_1”,不需要改。
消息:在下来框中选择“GetListIecmsSP_RequestMsg”
接收图形
名称:接受缺省的名称“Receive_2”,不需要改。
消息:在下来框中选择“GetListIecmsSP_ResponseMsg”
10.3. 连接图形和端口
鼠标指向左边GetListIecmsSP_WebPort端口的Request上的绿色小块,按下鼠标左键不放,拖动鼠标,可以看到一根连线随着鼠标移动,拖拉至接收图形“Receive_1”上的绿色小块松开鼠标,GetListIecmsSP_WebPort端口的Request跟接收图形“Receive_1”连接好了。
同样把发送图形“Send_1”跟GetListIecmsSP_Port端口的Request连接,接收图形“Receive_2”跟GetListIecmsSP_Port端口的Response连接。
现在的业务流程图是这样的:
到这一步的工作流程是这样的:
GetListIecmsSP_WebPort端口接收到的请求数据请求被发送到接收图形“Receive_ 1 ” ,然后原封不动的传给发送图形“Send_ 1 ” ,图形“Send_ 1 ” 将此消息发给GetListIecmsSP_Port端口,GetListIecmsSP_Port端口又通过sql适配器将请求发给sql server,从sql server返回的数据通过GetListIecmsSP_Port端口的Response传给接收图形“Receive_ 2 ” 。接收图形“Receive_ 2 ” 收到的消息就是从数据库返回的中午字段名称的数据。
下面我们把这个中文字段名称的消息转换为英文字段的消息。
10.4. 消息架构映射
前面我们新建了跟返回消息的xsd架构一致,但是字段名改为英文的xsd架构,现在需要把中文字段名称的消息转换为英文字段的消息。
在工具箱中拖拉一个“构造消息”图形放置在“Receive_2”下面。
在属性面板中,接收缺省名称“ConstructMessage_1”
“构造的消息”属性表示被这个“构造消息”图形处理后的消息是什么,这里我们需要的结果是英文字段名的消息,所以这里“构造的消息”选择“GetListIecmsSP_ResponseMsg_En”。
在工具箱中拖拉一个“转换”图形放置“构造消息”图形的内部。
双击“转换”图形,出现“转换配置”向导对话框
选“新建映射”
完全限定的映射名称:zyzh_biztalk_project.GetListIecmsSP_Trans
先选中转换中的“源”,在右边“转换源”的变量名称的下拉列表中选择“GetListIecmsSP_ ResponseMsg.parameters”,这是sql server返回的中文字段的消息。
然后在转换中的“目标”,在右边“转换源”的变量名称的下拉列表中选择“GetListIecmsSP_ ResponseMsg_En”,这是sql server返回的英文字段的消息。
选中“单击‘确定’即启动Biztalk映射器”,点击“确定”
Biztalk启动架构映射器,提供消息架构之间的转换功能设计。
分别展开源和目标架构,如下图,把相应的属性通过拖拉联系起来。
然后保存,在解决方案资源管理器中,会生成一个叫“GetListIecmsSP_Trans.btm”的映射文件。
10.5. 消息转换
返回到客户端我们希望是一个XmlDocument类型,上面的消息映射是把中文架构的消息转换为英文架构的消息,还要做一个把架构消息转换为一般的XmlDocument的转换。
在转换构造消息图形下面再添加一个“消息构造”图形,在属性面板中,接收缺省名称“ConstructMessage_2”,将“构造的消息”选择为“Message_xml”。
在工具箱中拖拉一个“消息赋值”图形放置在“ConstructMessage_2”图形内。
双击“消息赋值”图形,在biztalk表达式编辑器中输入:
Message_xml = GetListIecmsSP_ResponseMsg_En;
10.6. 添加发送端口
最后,添加一个发送端口,把返回的XmlDocument消息返回到GetListIecmsSP_WebPort端口的Response,通过web services返回到客户端。
完整的业务流程图:
11. 生成、部署项目
Biztalk的项目需要编译为强名称的程序集,才能部署到biztalk服务器上,biztalk项目部署到服务器上表现为一个biztalk的应用程序。
11.1. 生成强名称密钥文件
在“microsoft visual studio 2005 ” 程序组里,选“visual studio tools”--“visual studio 2005 command promte”进入命令行模式。
导航到biztalk项目所在的文件夹
输入以下命令:sn –k zyzh_biztalk_project.snk
在biztalk项目所在的文件夹生成zyzh_biztalk_project.snk密钥对文件。
11.2. 设置biztalk项目属性
在解决方案资源管理器中,右键点击zyzh_biztalk_project项目,选择“属性”
在属性窗口左边选“通用属性”-“程序集”,右边“强名称”下的“程序集密钥文件”,点击旁边的按钮,找到上一步生成的zyzh_biztalk_project.snk密钥对文件,选择。
在属性窗口左边选“配置属性”-“部署”,右边“biztalk组”下的“应用程序名称”,输入:zyzh_biztalk_project。这个应用程序名称就是部署到biztalk服务器后的应用程序名。
11.3. 生成部署项目
在解决方案资源管理器中,选中zyzh_biztalk_project项目,鼠标右键,选“生成”。
如果是严格按照前面的步骤做的话,这里就会很顺利的编译成功,如果编译报错的话,请根据报的错和对照前面的各个步骤仔细检查一下。
在解决方案资源管理器中,选中zyzh_biztalk_project项目,鼠标右键,选“部署”。
正常的话,部署也会成功。
12. 生成web services
这一步要把上面的biztalk项目中的GetListIecmsSP_WebPort端口暴露为web services,这个工作由biztalk本身提供的biztalk web services发布向导来做。
在biztalk程序组中启动“biztalk web services发布向导”。
欢迎页面后,向导需要选择是将业务流程发布为web serivces还是将架构发布为web serivces:
这里选择将前面生成的业务流程发布为web services。
点击“下一步”
选择biztalk程序集,是要指定上面项目编译后的dll文件,在biztalk项目文件夹的bin下找到zyzh_biztalk_project.dll文件,选择。
点击“下一步”
选择业务流程端口,这里会列出选择的业务流程中所有的接收端口(因为只有接收端口才能发布为web services,包括单向的接收端口,双向的接收端口),选择需要发布的端口。本项目只有一个可以发布的端口,默认已经被选择。
默认的一个端口biztalk的web services向导生成一个asmx文件,端口中的一个操作对应一个WebMethod。
一般在业务流程中一个端口包含一个操作,也就是一个接收端口对外暴露为一个WebMethod。大多数情况下,一个web services对外提供多个WebMethod,一般选择“将所有的端口合并到一个web services中”将所有端口都归入到一个asmx文件中,以便在一个web services访问多个WebMethod。
点击“下一步”
指定web services属性,这里设置web services目标命名空间为:http://zyzh.szbti.gov.cn
其他SOAP选项不用选,本项目不使用附加的SOAP标头
点击“下一步”
指定要生成的asp.Net web services的参数,位置指的是web services发布URL,就是别的系统访问此web services的地址,如图设置。
如果允许匿名访问就选择“允许匿名访问web services”。本项目允许匿名访问
选择“在以下应用程序中创建biztalk接收位置”,并在下拉列表中选择前面部署的“zyzh_biztalk_project”项目。这个选项实际上是生成web services的物理端口,这个端口等会要跟biztalk项目业务流程中的“GetListIecmsSP_WebPort”逻辑端口绑定。
点击“下一步”,完成向导。
biztalk web services发布向导在http://localhost/zyzh_biztalk_project_Proxy已经生成了一个web services,在浏览器中输入上名的URL,可以看到这个web services
13. 配置biztalk应用程序
接下来的任务是要配置biztalk应用程序,新建物理端口,将物理端口和逻辑端口绑定。
在biztalk程序组中,打开“biztalk server 管理”
在biztalk管理界面的左边,如下图找到应用程序中的“zyzh_biztalk_project”,这就是之前部署到biztalk server的应用程序。
现在开始配置zyzh_biztalk_project应用程序,在zyzh_biztalk_project上点击鼠标右键,选“配置(C)…”,打开配置应用程序窗口。
在左面的窗口业务流程选择“GetListIecmsSP_Flow”,右边主机在下拉列表中选择“BiztalkServerApplication”。
绑定部分,就是将逻辑端口跟物理端口进行绑定。
在输入端口部分,本项目有一个入站逻辑端口“GetListIecmsSP_WebPort”,在对应的接收端口(物理端口)中选择“WebPort_zyzh_biztalk_project_Proxy/zyzh_biztalk_project_GetListIecmsSP_Flow_GetListIecmsSP_WebPort”,这个物理端口就是web services向导生成的web services的物理端口。
在输出部分,是sql适配器的物理端口,需要新建。
选中出站逻辑端口中“GetListIecms_Port”端口,在右边的下拉列表中选择“新建发送端口”,弹出发送端口对话框。
名称设置为:GetListIecmsSP_PhyPort
传输类型选“SQL”,这个端口是sql适配器。点击旁边的“配置”按钮
连接字符串指向本项目使用的数据库
文档目标命名空间设为biztalk项目中sql适配器向导生成的那个xsd文件的目标命名空间http://zyzh.szbti.gov.cn/GetListIecmsSP
响应文档跟元素名称,设为上面xsd文件中响应根元素“GetListIecmsSP_ResponseRoot”
点击“确定”
Sql适配器是使用xmlsql访问sql server的,所以
发送管道选:XMLTransmit
接收管道选:XMLReceive
点击确定关闭发送端口窗口,回到配置应用程序窗口,到此应用程序已配置好,点击“确定”。
14. 运行biztalk应用程序
Biztalk应用程序已配置好,相应的web services也已生成,可以运行程序进行测试了。
在biztalk管理界面,在“zyzh_biztalk_project”上点击右键,选“启动(S)…”,弹出一个启动提示窗口
直接点击“启动”,biztalk开始启动应用程序的过程,正常的话不会有已经启动应用程序的提示,可以点击“zyzh_biztalk_project”项目,在右边窗口的上方会有这个项目正在运行的绿色箭头显示,如下图:
三. 测试biztalk的项目
上面的biztalk项目对外公开了一个web services的方法,下面建一个winform的测试项目来引用这个web services,然后调用它的WebMethod,获得的结果,显示在一个dataGridView中。
1. 新建winform项目
在ZYZH_Solution解决方案下新建一个winform的项目,取名zyzh_test_project。
2. 引用web services
在解决方案管理器中,在zyzh_test_project项目上点击鼠标右键,选“添加web引用”,弹出添加web应用对话框,把前面web services向导生成的web services的URL输入到URL中,点击“前往”按钮
如图,系统会找到这个URL上可用的web services,本例中,只有一个可以的web services,点击这个“WebService_zyzh_biztalk_project.asmx”,出现如下图:
系统找到WebService_zyzh_biztalk_project.asmx中包含的WebMethod,并自动设置web引用名为localhost,这个就是将要在引用项目中生成的web services代理类的名称空间。不用修改,直接点击“添加引用”,把web services引用到测试项目中。
3. 添加代码
将zyzh_test_project项目中的Form1.cs改名为TestForm.cs,在TestForm窗体中添加一个dataGridView控件和一个button控件
点击测试按钮,程序新建一个web services的代理类,然后使用一些预设的查询插入,调用web services公开的WebMethod,最后把返回的数据转成DataSet,显示在dataGridView。
测试按钮点击事件的代码:
private void button1_Click(object sender, EventArgs e)
{
//新建web services的代理类,这个类提供了一个GetListIecmsSP_WebMethod的方法
zyzh_test_project.localhost.WebService_zyzh_biztalk_project myTestMap = new WebService_zyzh_biztalk_project();
//新建GetListIecmsSP_WebMethod方法的参数对象
zyzh_test_project.localhost.GetListIecmsSP_RequestRoot myRequestRoot = new GetListIecmsSP_RequestRoot();
//新建GetListIecmsSP_WebMethod方法的参数对象的属性对象
GetListIecmsSP_RequestRootGetListIecmsSP myRequestRootGetListIecmsSP = new GetListIecmsSP_RequestRootGetListIecmsSP();
//给属性对象赋值,就是查询时的查询参数,对应GetListIecmsSP_Sch架构的请求部分的参数.
//这是是示例,在程序中预设的下面这些查询值,实际中一般用文本框收集用户的输入参数。
myRequestRootGetListIecmsSP.farenhuofuzeren = "王";
myRequestRootGetListIecmsSP.gongshangdengjihao = "";
myRequestRootGetListIecmsSP.jingyingzhedaima = "";
myRequestRootGetListIecmsSP.jingyingzhezhongwenmingcheng = "";
myRequestRoot.GetListIecmsSP = myRequestRootGetListIecmsSP;
//调用web services的代理类的GetListIecmsSP_WebMethod方法,此方法返回的是XmlNode类型
System.Xml.XmlNode myNode = myTestMap.GetListIecmsSP_WebMethod(myRequestRoot);
DataSet myDataSet = new DataSet();
//将XmlNode类型的对象转成DataSet类型,以便dataGridView显示数据
System.IO.StringReader myStringReader = new System.IO.StringReader(myNode.OuterXml);
XmlReader myXmlReader = XmlReader.Create(myStringReader);
myDataSet.ReadXml(myXmlReader);
dataGridView1.DataSource = myDataSet.Tables[0];
}
4. 运行测试
编译运行测试项目,点击测试按钮,结果如下:
测试程序中设置的查询条件,myRequestRootGetListIecmsSP.farenhuofuzeren = "王",结果也是返回的farenhuofuzeren包含“王”的所有记录。