zoukankan      html  css  js  c++  java
  • 深入biztalk消费Web services

     

    消费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)]

    public class SAMPLEService : System.Web.Services.WebService

    {

        [WebMethod]

        public string[] TwoWayMethod(float a,Person person)

        {

            return new string[] { "1", "2", "3","4" };

        }

    }

    public class Person

    {

        public string firstname;

        public string lastname;

        public Contact contact;

    }

    public class Contact

    {

        public string telpohone;

        public string fax;

        public string address;

        public int postalcode;

    }

     

    1、 TwoWayMethod方法

    方法签名:public string[] TwoWayMethod(float a,Person person)

    有两个输入参数:简单类型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来描述类型。比如:

    public string[] TwoWayMethod(float a,Person person)

    这个webmethod的输入参数有两个:float a,Person person,在WSDL的中的类型表现是这样的:

    <s:element name="TwoWayMethod">

    <s:complexType>

    <s:sequence>

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

          <s:element minOccurs="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序列化的。

    public string[] TwoWayMethod(float a,Person person)

    这个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.    Web Port Types

    一个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后的作用

    Biztalk项目引用web services形成的odx流程文件是只读的,不能单独使用这个odx文件。Odx的作用是在新建的自定义orchestration流程中,这个odxweb端口类型和web消息类型都会被自动的加入到进去,只是这些端口类型和消息类型不能被修改。

    在自定义orchestration流程中要消费引用的web serviceswebmethod就需要使用这些端口类型,通过这些类型的端口跟物理soap的发送端口绑定。

    2.4.    biztalk项目引用web services不生成代理类吗?

    这是个问题,一般的应用项目在引用web services后会生成一个从System.Web.Services.Protocols.SoapHttpClientProtocol类继承的本地代理类,应用程序通过调用代理类来调用web services

    但是从上面biztalk引用web services的过程,在生成的引用文件中似乎没有发现生成本地代理类。是不是biztalk引用web services并不生成本地代理类呢?

    我们来分别看一下windows应用项目和biztalk项目引用这个web services后生成的恶exedll里的内容。

    clip_image005

    Figure 4. ildasmwindows应用项目引用web services后的exe文件

     

    windows应用引用web services后,在引用web services的名称空间下生成本地代理类,代理类的名称跟web services类名一样。

    除了代理类,webmethod方法中用到的参数如果不是简单的数据类型,也会在本地生成参数类型(参数类型在WSDL中以schema形式描述),windows项目引用web services会把参数类型从schema形成转成class类形式。

     

    clip_image006

    Figure 5. ildasmbiztalk项目引用web services后的dll文件

     

    可以看到,biztalk项目引用web services后,在生成的dll中同样有继承自System.Web.Services.Protocols.SoapHttpClientProtocol的本地代理类,说明biztalk项目引用web services后也要生成本地代理类,并且biztalk如果调用web services同样也是需要通过这个代理类来调用(后面还会继续谈到这个问题)。

     

    3、 建立orchestration消费web services

    设计一个流程消费上述的那个web services
    clip_image007

    Figure 6. 消费web servicesorchestration

     

    流程很简单,Port_1从一个文件夹中读取Person格式的xml文件:

    <ns0:Person xmlns:ns0="http://chnking.com/">

      <ns0:firstname>firstname_0</ns0:firstname>

      <ns0:lastname>lastname_0</ns0:lastname>

      <ns0:contact>

             <ns0:telpohone>telpohone_0</ns0:telpohone>

             <ns0:fax>fax_0</ns0:fax>

             <ns0:address>address_0</ns0:address>

             <ns0:postalcode>10</ns0:postalcode>

      </ns0:contact>

    </ns0:Person>

     

    赋值形状MessageAssignment_1把读取进来的person消息赋给要发送到web services的多部分消息的person消息部分,同时给多部分消息的a消息赋一个浮点数的值:

    Message_WSRequest.a = (System.Single)3.1416;

    Message_WSRequest.person = Message_person;

    建立消费web services的端口。

    新建一个端口,端口类型选引用web services后生成的那个web端口类型。如图所示:

    clip_image009

    Figure 7. 新建消费web services的端口

     

    绑定方式默认为现在指定,biztalk会把引用web servicesURI和需要采用的SOAP适配器记录下来,部署后根据这些信息生成物理SOAP发送端口并跟这个双向发送端口绑定。

    clip_image011

    Figure 8. 双向发送端口的绑定

     

    web services返回的消息通过Port_2端口写入到另一个文件夹。

     

    4、 部署设置消费web servicesbiztalk项目

    编译部署biztalk项目。

    部署好后,查看项目配置,可以看到消费web services的双向发送端口来已经跟一个SOAP发送端口绑定。

    剩下的添加两个file适配器的端口,分别设置为读取person xml文件的输入端口和保存最后结果的发送端口。

    5、 SOAP端口的设置

    一般按照部署后的默认配置,这个SOAP已经能够很好的工作了,但是为了更深一步的了解SOAP端口,来看看SOAP端口的各个设置。

    5.1.    General标签

    clip_image013

    Figure 9. SOAP端口的General标签设置

     

    Web services URL:

    引用web servicesURL

    Authentication type

    web services方的验证方式。

    Anonymous – 匿名验证,web services服务端允许匿名访问可以设置为Anonymous

    Basic – 基本身份验证,web services服务端采用基本身份验证时采用,需要客户端提供用户名和密码,在Credentials中输入用户名和密码。此用户名和密码被转换成base64编码连同SOAPhttp请求一起发送到服务端。

    NTLM – web services服务端设置了windows集成验证时采用,windows集成验证的客户端可以选用NTLM验证和Kerberos两种验证方式,但SOAP只使用NTLM验证,并且使用客户端登录帐户的用户名和密码进行验证凭据的传送。关于IIS的身份验证的详细讨论请参看《IIS的各种身份验证详细测试》《应用程序向IIS传送身份验证》。

     

    5.2.    Proxy标签

    clip_image015

    Figure 10. SOAP端口的Proxy标签设置

     

    用于设置访问web services是否要使用代理服务器。

    Use Handler’s default proxy configuration

    使用SOAP handler级别的代理设置。

    Biztalk Group下打开Platform Setting目录,在其下选择Adapters,展开,所有的适配器都列在其中,选择SOAP,看右边窗口的显示。

    双击发送handler的那一条,在弹出的SOAP – Adapter Handler Properties窗口中,点Properties按钮,在这里设置handler级别的代理设置,如下图:clip_image016

    Figure 11. SOAP端口handler级别的Proxy设置

     

    Dot not use proxy

    调用web services不使用代理服务器。

    Use proxy

    设置这个SOAP端口使用的代理服务器。

     

    5.3.    Web services 标签

    clip_image018

    Figure 12. SOAP端口的Web services标签设置

     

    这个标签设置使用哪个代理类访问实际的web services

    SOAP端口也是需要使用从SoapHttpClientProtocol继承的本地代理类访问web services。这里就是指定使用哪个代理类的。

    Orchestration Web port

    Biztalk项目引用web services后形成了web端口类型和web消息类型,这些在biztalk项目编译后就会生成一个本地代理类,跟一般windows项目引用web services后形成的代理类基本一致。本设置就是选择这个SOAP使用引用biztalk项目编译后自己形成的代理类。

    The following setting

    选择其他的代理类,但是这个代理类必须是从SoapHttpClientProtocol继承的。

    Assembly name 包含了代理类的assembly

    Type name:在assembly中选择这个SOAP适配器要使用的那个代理类

    Method name 选择这个SOAP要调用的web services中的方法。

    Use SOAP 1.2

    设置发送到web services服务端的SOAP消息使用SOAP1.2规范的。

    但是实际测试这个选项好像不起作用。

  • 相关阅读:
    jQuery scroll事件
    jquery offset() 与position()方法的区别
    股票基本知识
    swfObject 使用说明
    javascript和swf在网页中交互的一些总结
    TCP 同步传输:客户端发送,服务器段接收
    读取Excel
    sql 执行顺序
    支付宝及时到帐接口
    Ajax中get提交和post提交的区别
  • 原文地址:https://www.cnblogs.com/chnking/p/983902.html
Copyright © 2011-2022 走看看