深入biztalk消费Web services

上一篇 / 下一篇  2008-06-06 09:48:05 / 个人分类:ERP原理

消费Web services允许把现有的Web services加入到业务流程,可以在一个orchestration整合进多个Web services

可以在orchestrationWeb ports消费(调用)Web service,为了在orchestration调用一个Web service,需要建立一个Web port和构造一个Web messages

 

本文以一个比较典型的实例来说明biztalk如何消费一个web services,深入分析biztalk消费web services的一些内部机制。

 

一、 Web services

有一个Web services,很简单,代码如下:

[WebService(Namespace ="http://chnking.com/")]

[WebServiceBinding(ConformsTo =WsiProfiles.BasicProfile1_1)]

publicclassSAMPLEService: System.Web.Services.WebService

{

   [WebMethod]

   publicstring[] TwoWayMethod(floata,Personperson)

   {

       returnnewstring[] {"1","2","3","4"};

   }

}

publicclassPerson

{

   publicstringfirstname;

   publicstringlastname;

   publicContactcontact;

}

publicclassContact

{

   publicstringtelpohone;

   publicstringfax;

   publicstringaddress;

   publicintpostalcode;

}

 

1、TwoWayMethod方法

方法签名:publicstring[] TwoWayMethod(floata,Personperson)

有两个输入参数:简单类型float和自定义的类PersonPerson类有三个公开字段,其中有一个字段的类型是自定义类型ContactContact类又包括四个公开字段

返回参数为一个字符串的数组。

2、查看web servicesWSDL

一个web services要被其它应用调用,就必须告诉其它应用如何去调用web services中的webmethod,比如这个web services中包含哪些可以调用的方法,每个方法的方法签名是怎样的,方法是用的输入输出参数的类型又是什么等等,这些都是通过web servicesWSDL来进行描述的。

要查看一个web servicesWSDL可以向web services所在的asmx文件的URL发送http请求,并附带?wsdl参数即可,比如:http://biztalkr2:81/WSTest/Service1.asmx?WSDL

来查看一下上面这个web servicesWSDL中跟TwoWayMethod相关的部分:clip_image001

Figue 1.WSDL中跟TwoWayMethod相关的部分

 

这个WSDL的结构需要按照从下面往上面的顺序看。

2.1.   portType标签

portType标签用来描述整个的web servicesportTypename属性即为这个web services类的类名。这个标签下包含了所有的可用方法,每个operation标签表示一个方法。

2.2.   operation标签

每一个operation标签表示web services里的一个webmethod方法,operation标签的name属性是这个webmethod的方法名。

2.3.   Inputoutput标签

Inputoutput标签分别表示一个operationwebmethod方法)的输入和输出的参数集合,这里叫做消息,不管输入参数有几个,每个参数有多么复杂,只有一个表示这些输入参数的消息,就是input标签的message属性表示的那个消息。对于输出消息也一样。

2.4.   Message标签

方法的输入输出参数都用一个消息来表示,message标签表示一个这样的消息,message标签按下面有个part标签,用来具体指示这个消息在schema中的类型,类型以element形式表现出来,即part标签的element属性指定的那个element

对于输入参数消息,part标签的element属性命名同webmethod方法名。

对于输出参数消息,part标签的element属性命名同webmethod方法名+ response

表示类型的element都被集中放置在types标签内。

2.5.   types标签

此标签用来描述所有webmethod所要用到的类型,都以element来描述类型。比如:

publicstring[] TwoWayMethod(floata,Personperson)

这个webmethod的输入参数有两个:floata,Personperson,在WSDL的中的类型表现是这样的:

<s:element name="TwoWayMethod">

<s:complexType>

<s:sequence>

     <s:elementminOccurs="1"maxOccurs="1"name="a"type="s:float" />

     <s:elementminOccurs="0"maxOccurs="1"name="person"type="tns:Person" />

   </s:sequence>

 </s:complexType>

</s:element>

其中a元素是简单的float类型,不需要另加说明。

person元素是Person类型,Person类型又是个complex类型,在types标签里还包括了这个Person类型的定义。只要是消息中引用到的非简单类型,都需要在types中进行定义描述。

 

二、 Biztalk消费Web services的一般方法

这个Web services中的TwoWayMethod方法是个比较复杂的方法,具有两个输入参数,其中一个参数是自定义的类,并且嵌套了另一个自定义的类,返回的参数也是字符型的数组,相对比较复杂。

1、新建biztalk项目

新建一个biztalk项目,用来测试Web servicesTwoWayMethod方法。

2、引用Web services

跟一般的应用项目要调用一个Web services一样,首先在项目中引用这个Web services。但是在biztalk项目中引用一个Web services跟一般的应用引用Web services表现不一样。

clip_image003

Figure 2. biztalk项目和windows项目引用同一个web services的不同表现

 

windows项目引用web services后,在引用目录下Reference.map生成一个Reference.cs文件,这个文件是被引用的web services在本地生成的代理类,派生自System.Web.Services.Protocols.SoapHttpClientProtocol类。

Biztalk项目引用web services后,在引用目录Reference.map下生成两类文件,一个odx类型的orchestration文件,和数量不定的xsd架构文件。分别看一下这两类文件都生成了什么。

2.1.   xsd架构文件

2.1.1.   每个复杂参数类型被生成一个schema文件

web services中的每个webmethod的参数,不管是输入参数还是输出参数,只要不是简单数据类型,每个参数类型就会被生成一个schema文件,所有类型都将都被转成schema类型,这就意味着,参数类型必须是可以被xml序列化的。

publicstring[] TwoWayMethod(floata,Personperson)

这个webmethod方法,参数person和返回的string[]类型的参数都不是简单数据类型,所以这两个参数类型分别被形成schema文件,表现为在Reference.map下的Reference.xsdReference1.xsd文件。

2.1.2.   简单参数类型不需要生成schema

简单数据类型(intstringfloat等等)这些schema本身支持的简单类型,不需要另外用schema进行定义。比如上面那个webmethod方法中的a参数。

2.2.   odx流程文件

clip_image004

Figure 3. biztalk项目引用web services后形成的odx流程文件

 

引用web services后形成的odx流程文件是把web services的方法转变成orchestration的端口类型和消息类型,实际上反映的也就是每个webmethod的方法签名。

2.2.1.   WebPortTypes

一个web端口类型代表了一个web services的类。

每个端口类型下可以有多个操作(operation),每个操作就是web services的类里的一个webmethod方法。

每个操作都有两个消息,分表表示输入消息Request,输出消息Response。不管输入参数或输出参数有多少,所有的输入参数都被放入到一个消息中,同样所有的输出参数也都被放入到一个消息中。

每个消息都是一个多部分消息类型。这些多部分消息类型由Web Message Types部分定义。

注意:

如果webmethod方法没有返回值(void),webmethod仍要生成返回消息,在biztalkweb端口类型中仍要生成返回的response部分。

2.2.2.   Web Message Types

Web消息类型定义web端口的每个操作使用的消息,都为多部分消息。

如果一个操作的输入参数有多个参数,则每个参数在多部分消息中作为一个消息部分出现。

每个参数的参数名就是消息中一个消息部分的部分名。

Webmethod方法的retuen返回参数没有名称,默认就是“Webmethod方法名+Result”做为消息部分名。

注意:

如果webmethod方法没有返回值(void),webmethodresponse部分对应的web多部分消息类型,就是一个只有消息上下文而没有消息部分的web消息类型。

2.3.   引用web services

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 797
  • 日志数: 35
  • 建立时间: 2008-03-31
  • 更新时间: 2008-06-06

RSS订阅

Open Toolbar