zoukankan      html  css  js  c++  java
  • biztalk中使用.net class类型的消息(二) 只使用.net class消息的示例

    .    本示例的用途... 1

    .    新建解决方案... 1

    .    属性架构biztalk项目... 2

    1.  新建属性架构的biztalk项目... 2

    1.1.       指定密钥文件... 2

    1.2.       设置部署属性... 2

    2.  新建属性架构... 2

    .    .net class消息项目... 2

    1.  新建类库项目... 2

    1.1.       指定密钥文件... 2

    1.2.       设置生成事件... 2

    1.3.       引用netClassMessage_PromoteXSD项目... 3

    2.  新建.net class类型消息的类... 3

    .    Orchestration流程biztalk项目... 5

    1.  新建Orchestration流程biztalk项目... 5

    1.1.       指定密钥文件... 5

    1.2.       设置部署属性... 5

    2.  建立rchestration流程... 5

    2.1.       新建两条消息... 5

    2.2.       设计流程... 5

    3.  编译部署项目... 6

    4.  设置物理端口... 6

    .    测试示例... 7

    1.  net class类型消息的序列化示例... 7

    2.  测试... 8

     

    一.   本示例的用途

    本示例演示如何在orchestration中使用.net class类型的消息。.net class类型消息进入到orchestration中始终保持同类型消息之间的转换,输出也是同一个消息类型。如何在.net class类型中定义序列化,定义升级属性、可分辨字段。

    大致步骤如下:

    l         file适配器读取一个.net class类型的消息到orchestration

    l         orchestration中把入站的.net class 赋给一个同类的消息,然后对新构造的消息就行一些处理,示例中仅做一个简单的修改属性的处理。

    l         最后把处理好的.net class消息输出到一个文件夹。


       

       本示例的完整代码下载(netClassMessage.rar
     

    二.   新建解决方案

    新建一个空解决方案,名字为netClassMessage,解决方案作为下面所有项目的容器,其后建的各个项目都放在这个解决方案中。

    在解决方案根目录下新建一个强名称密钥文件,biztalk项目生成的assembly需要部署到GAC,需要密钥文件。这里生成密钥文件netClassMessage.snk

    如何生成密钥文件见biztalk随机文档:Getting Started > BizTalk Server 2006 Tutorials > Before You Begin the Tutorials >Step 4: Create a Strong Name Key File

    三.   属性架构biztalk项目

    本示例中使用的.net class类型消息包含了升级属性和可分辨字段,在xml消息中定义升级属性需要有一个属性架构,同样,.net class类型中升级属性也需要同样的属性架构。.net class类型消息是一个.net类,在.net类库项目中定义,而属性架构是biztalk中才有的概念,需要在biztalk项目定义,这样消息类和属性架构不可能在同一个项目中。.net class类型消息要使用到属性架构,所以.net class类型消息所在的.net class类库项目要引用属性架构所在的biztalk项目。

    这一步建立属性架构所在的biztalk项目。

    1.    新建属性架构的biztalk项目

    netClassMessage解决方案中新建一个biztalk项目,名称为netClassMessage_PromoteXSD

    设置项目属性,打开netClassMessage_PromoteXSD项目属性窗口

    1.1.     指定密钥文件

    在左边选“通用属性 assembly”,然后在右边的“strong name Assembly key file”中指定密钥文件,指向上面生成的那个密钥文件netClassMessage.snk的路径。

    1.2.     设置部署属性

    在左边选“配置属性 deployment”,“server”设为开发用的本机机器名,“Application name”设为netClassMessage,“Redeploy”、“Install to Global Assembly Cache”、“Restart Host Instance”都设为true,为什么这么设置,请见“开发环境中biztalk项目设置注意事项”。

    2.    新建属性架构

    netClassMessage_PromoteXSD项目中添加一个新项,在打开的“添加新项”窗口中,左边选“schema files”,在右边选“Property Schema”,架构名称设为PromotedProperties.xsd,确定。

    在新建的PromotedProperties.xsd中把默认的“property1”名称改为PropertyName,保存。本示例就使用一个升级属性PropertyName

    四.   .net class消息项目

    这是个C#的类库项目,这个项目里将要定义.net class类型消息的类。

    1.    新建类库项目

    netClassMessage解决方案中新建一个C#类库项目,名称为netClassMessage_netClass

    把前面生成的密钥文件netClassMessage.snk拷贝到这个项目的根目录下。因为这个.net class类型的消息要被biztalk使用,所以消息类所在的assembly也要被部署到GAC,这个类库dll也必须要有强名称密钥。

    设置项目属性,打开netClassMessage_netClass项目属性窗口。

    1.1.     指定密钥文件

    在左边选“签名”,在右边“为程序集签名”前打勾,然后在下面选择密钥文件,指向项目根目录的那个netClassMessage.snk文件的路径。

    1.2.     设置生成事件

    在左边选“生成事件”,右边“生成后事件命令行”中输入以下代码:

     

    CALL "%VS80COMNTOOLS%\vsvars32.bat" > NUL

    GACUTIL /if "$(TargetPath)"

     

    这两行代码是告诉编译器,把每次这个项目编译完后生成的dll加载到GAC中,如果GAC中已经有了同样的dll,则直接覆盖。这样保证每次编后后都能自动将最新版的dll加载到GAC,省去手工把dll加入到GAC的麻烦。

    1.3.     引用netClassMessage_PromoteXSD项目

    消息类中有升级属性,需要用到属性架构,所以在项目中要引用前面建立的属性架构的项目。

    2.    新建.net class类型消息的类

    netClassMessage_netClass项目中添加一个新项,在打开的“添加新项”窗口中,选“类”,类名称设为netClass.cs,确定。

    此类的代码如下:

    using System;

    using Microsoft.XLANGs.BaseTypes;

     

    namespace netClassMessage_netClass

    {

        //表示此类是可以序列化的

        [Serializable()]

        //此属性设置目标名称空间Target Namespace

        [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://myURL")]

        //类名称相当于XSD中的根元素,上面设定的名称空间加上类名称就组成了消息类型

        public class netClass

        {

            private string _ID;

            private string _name;

            private string _address;

            private string _propertyName;

            public netClass()

            {

                _ID = System.Guid.NewGuid().ToString();

            }

            //DistinguishedField属性表示这个字段是可分辨字段

            [DistinguishedField]

            public string ID

            {

                get

                {

                    return _ID;

                }

                set

                {

                    _ID = value;

                }

            }

            [DistinguishedField]

            public string Name

            {

                get

                {

                    return _name;

                }

                set

                {

                    _name = value;

                }

            }

            [DistinguishedField]

            public string Address

            {

                get

                {

                    return _address;

                }

                set

                {

                    _address = value;

                }

            }

            [DistinguishedField]

            //netClassMessage_PromoteXSD.PropertyName是在属性schema中定义的属性,Property属性

            //指示这个字段为promote字段,对应netClassMessage_PromoteXSD.PropertyName

            [Property(typeof(netClassMessage_PromoteXSD.PropertyName))]

            public string PropertyName

            {

                get

                {

                    return _propertyName;

                }

                set

                {

                    _propertyName = value;

                }

            }

        }

    }

     

    这个消息类的详细说明见“biztalk中使用.net class类型的消息(一) -- 相关知识介绍”。

    五.   Orchestration流程biztalk项目

    上面定义了属性架构和.net class消息类,现在要开始设计业务流程,使用这个.net class消息。

    1.    新建Orchestration流程biztalk项目

    步骤跟属性架构项目一样,在netClassMessage解决方案中新建一个biztalk项目,名称为netClassMessageProcessProject

    设置项目属性,打开netClassMessageProcessProject项目属性窗口

    1.1.     指定密钥文件

    在左边选“通用属性 assembly”,然后在右边的“strong name Assembly key file”中指定密钥文件,指向上面生成的那个密钥文件netClassMessage.snk的路径。

    1.2.     设置部署属性

    在左边选“配置属性 deployment”,“server”设为开发用的本机机器名,“Application name”设为netClassMessage,“Redeploy”、“Install to Global Assembly Cache”、“Restart Host Instance”都设为true,为什么这么设置,请见“开发环境中biztalk项目设置注意事项”。

    2.    建立rchestration流程

    netClassMessageProcessProject项目中添加一个orchestration,名称为MessageProcess.odx

    2.1.     新建两条消息

    新建一条消息,名称netClassMsg,消息类型选.net class,然后选“select from referenced”,在弹出“select artifact type”窗口中,左边选“netClassMessage_netClassassembly,窗口右边会出现这个assembly所包含的.net classs,这里为“netClass”。完整的消息类型就是netClassMessage_netClass.netClass

    再新建一条消息,名称为new_netClassMsg,消息类型跟上面那个消息一样。

    第一条消息作netClassMsg为一个.net class类型消息进站后的接收形状接收到的消息,第二个消息为新建的一个.net class类型消息,然后把第一条消息的相关属性赋给第二条消息的相关属性,相当于把入站的消息就行了转换。最后把新消息直接输出。

    2.2.     设计流程

    设计流程,添加端口,接收发送形状,消息构造形状,如图:

    l         端口ReceivePort

    设置端口类型为ReceivePortType,单项one-way,端口通讯方向为“I’ll always receiving on message this port”,端口绑定设为“specify later”。

    l         接收形状Receive_1

    消息设为netClassMsg

    l         消息赋值形状MessageAssignment_1

    消息赋值形状中,输入以下代码:

    //.net class消息只能通过new操作符构造。

    new_netClassMsg = new netClassMessage_netClass.netClass();

    //将入站的消息的相应属性赋给新消息

    new_netClassMsg.Name = netClassMsg.Name;
       new_netClassMsg.Address = netClassMsg.Address;
       new_netClassMsg.PropertyName = "new Property";

    l         发送形状Send_1

    消息设为new_netClassMsg

    l         端口SendPort

    设置端口类型为SendPortType,单项one-way,端口通讯方向为“I’ll always sending on message this port”,端口绑定设为“specify later”。

    3.    编译部署项目

    编译整个解决方案,然后部署整个解决方案。

    前面每个项目的属性都已经设置好,部署好后,两个biztalk项目的将被部署到biztalknetClassMessage应用程序中,类库项目也会被部署到GAC中。

    4.    设置物理端口

    打开biztalk server adminstration,在Applictions中会发现多了个刚才部署的netClassMessage应用程序,配置这个应用程序。

    对应ReceivePort逻辑接收端口新建一个接收端口,一个接收位置,适配器类型为File,路径指向解决方案中新建的目录“in”,接收管道选XMLReceive,一定要选XMLReceive,因为这个XML拆装器能解析.net class类型的消息(跟xml消息一样处理,在管道中.net class消息也是一个xml)。

    对应SendPort逻辑端口新建一个发送端口,适配器类型为File,路径指向解决方案中新建的目录“out”,接收管道选XMLReceive或者PassThruTransmit都行。

    配置完成,启动netClassMessage应用程序。

    六.   测试示例

    1.    net class类型消息的序列化示例

    本示例使用.net class类型的消息放置在解决方案的in目录下通过file适配器读入到orchestration。需要一个本例中.net class消息类型netClassMessage_netClass.netClass序列化后的消息文件。

    如何根据.net class类型生成一个消息实例的序列化后的文件呢?

    Dotnet framework SDK中提供了一个实用工具xsd.exe,可以把.net class消息类型转换成xsd架构类型。

    本示例.net class消息类型的assemblynetClassMessage_netClass.dll命令大致如下:

    XSD netClassMessage_netClass.dll

    在同一目录下就会产生一个叫schema0.xsd的文件,就是这个.net class类型消息对应的xsd的架构,本示例生成的架构是这样的:

    <?xml version="1.0" encoding="utf-8"?>

    <xs:schema xmlns:tns="http://myURL" elementFormDefault="qualified" targetNamespace="http://myURL" xmlns:xs="http://www.w3.org/2001/XMLSchema">

      <xs:element name="netClass" nillable="true" type="tns:netClass" />

      <xs:complexType name="netClass">

        <xs:sequence>

          <xs:element minOccurs="0" maxOccurs="1" name="ID" type="xs:string" />

          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />

          <xs:element minOccurs="0" maxOccurs="1" name="Address" type="xs:string" />

          <xs:element minOccurs="0" maxOccurs="1" name="PropertyName" type="xs:string" />

        </xs:sequence>

      </xs:complexType>

    </xs:schema>

     

    然后根据这个xsd文件就能在biztalk中自动生成一个xml实例,关于从xsd架构生成xml实例请见“biztalk中架构验证、实例生成和验证

    生成一个消息实例后,取名netClassMessage.xml,放到解决方案根目录备用。

    消息文件如下:

    <ns0:netClass xmlns:ns0="http://myURL">

    <ns0:ID>ID_0</ns0:ID>

    <ns0:Name>Name_0</ns0:Name>

    <ns0:Address>Address_0</ns0:Address>

    <ns0:PropertyName>PropertyName_0</ns0:PropertyName>

    </ns0:netClass>

    2.    测试

    把上面生成的实例消息文件netClassMessage.xml拷贝到解决方案下的“in”目录,过一会看解决方案下的“out”目录,应该会多出一个类似“{FA0DCEA1-9C1B-43B6-A633-D36FEF5D0862}.xml”这样形式的文件,打开查看,内容如下:

    <?xml version="1.0"?>

    <netClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://myURL">

      <ID>896afea7-e75c-445f-af9c-daac19535ef0</ID>

      <Name>Name_0</Name>

      <Address>Address_0</Address>

      <PropertyName>new Property</PropertyName>

    </netClass>

     

  • 相关阅读:
    The C++ Source A Pause to Reflect: Five Lists of Five, Part I The Most Important C++ Books...Ever
    Cg 1.5 Released
    Half Life 2 Source 引擎介绍
    一大清早去飙车
    [旧闻一]NVIDIA招揽前Intel顶级CPU设计师
    [旧闻二]AMD收购ATI
    【翻译】[Effective C++第三版•中文版][第17条]要在单独的语句中使用智能指针来存储由new创建的对象
    Generic:简化异常安全代码
    第29条: 力求使代码做到“异常安全”
    Linux压缩打包命令使用方法
  • 原文地址:https://www.cnblogs.com/chnking/p/660280.html
Copyright © 2011-2022 走看看