Focus on biztalk -- chnking

心无旁骛,专注于biztalk......

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  84 随笔 :: 0 文章 :: 606 评论 :: 75 引用

.    本示例的用途... 1

.    新建解决方案... 2

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

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

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

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

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

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

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

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

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

1.3.       引用netClassMessage_PromoteXSD项目... 3

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

.    Orchestration流程biztalk项目... 5

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

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

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

2.  新建xml消息的架构... 5

3.  .netclass类型消息项目中新建xml消息实例和读取xml实例的方法... 5

3.1.       新建xml实例... 6

3.2.       新建读取xml实例方法... 6

4.  建立rchestration流程... 6

4.1.       新建两条消息... 7

4.2.       设计流程... 7

5.  编译部署项目... 8

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

.    测试示例... 8

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

2.  测试... 9

 

一.   本示例的用途

本示例演示如何在orchestration中使用.net class类型的消息。.net class类型消息进入到orchestration中后,从零开始新建一个xml类型的消息,然后把.netclass类型的消息的相关属性赋给新建的xml类型的消息。重点在如何从零开始新建xml类型的消息。

大致步骤如下:

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

l         orchestration中接受一个的.net class 类型的消息

l         从零开始新建一个xml类型的消息。

l         然后把.netclass类型的消息的相关属性赋给新建的xml类型的消息。

l         最后把处理好的xml类型的消息输出到一个文件夹。

 

本示例的完整代码下载(netClassMessageToXSDMessage.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”设为netClassMessageToXSDMessage,“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”设为netClassMessageToXSDMessage,“Redeploy”、“Install to Global Assembly Cache”、“Restart Host Instance”都设为true,为什么这么设置,请见“开发环境中biztalk项目设置注意事项”。

2.    新建xml消息的架构

要在orchestration中把.netclass类型消息转换成xml,这个xml的架构就是用来构造xml消息的。

建一个简单的xsd的架构ClassSchema.xsd,跟.netclass类型相对应,包含如下几个字段:

l         ID

l         Name

l         Address

l         PropertyName

字段数据类型都是string,并且把所有四个字段都设置为可分辨字段,同时把PropertyName字段设置为升级属性。

3.    .netclass类型消息项目中新建xml消息实例和读取xml实例的方法

由于在orchestration中从零构造一个xml消息,只能通过XmlDocument赋值给xml消息来实现,关于从零开始构造xml消息的详细说明见“biztalk中使用.net class类型的消息(一) -- 相关知识介绍”。

3.1.     新建xml实例

从上节中ClassSchema.xsd生成个xml实例,如何从xsd生成xml实例请见“biztalk中架构验证、实例生成和验证”,把生成的xml文件改名为“ClassSchema.xml”,拷贝到.netclass类型消息项目netClassMessage_netClass的根目录下。

修改ClassSchema.xml属性“生成操作”为“嵌入的资源”。

3.2.     新建读取xml实例方法

写一个读取嵌入到dll中的ClassSchema.xml的方法。

在跟这个xml文件同一个项目中,新建一个类EmbeddedResourseProcessor.cs,这个类只有一个静态方法GetXmlDocResource,这个方法根据提供的xml文件名,在assembly中找到嵌入的xml文件,返回这个xml文件对应的XmlDocument的对象。

这个方法的完整代码如下:

using System;

using System.Collections;

using System.IO;

using System.Reflection;

using System.Xml;

 

namespace netClassMessage_netClass

{

    public class EmbeddedResourseProcessor

    {

        public static XmlDocument GetXmlDocResource(string fileName)

        {

            XmlDocument doc = null;

            Type type = MethodBase.GetCurrentMethod().DeclaringType;

            Assembly _assembly = Assembly.GetExecutingAssembly();

            string _namespace = type.Namespace;

 

            string resourceName =  _namespace + "." + fileName;

 

            Stream stream = _assembly.GetManifestResourceStream(resourceName);

            doc = new XmlDocument();

            doc.Load(stream);

            return doc;

        }

    }

}

 

4.    建立rchestration流程

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

4.1.     新建两条消息

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

再新建一条消息,名称为ClassSchemaMsg,消息类型为上面新建的xsd类型netClassMessageProcessProject.ClassSchema

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

4.2.     设计流程

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


l         端口ReceivePort

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

l         接收形状Receive_1

消息设为netClassMsg

l         消息赋值形状MessageAssignment_1

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

ClassSchemaMsg = netClassMessage_netClass.EmbeddedResourseProcessor.GetXmlDocResource("ClassSchema.xml");

ClassSchemaMsg.Name = "kent";

ClassSchemaMsg(netClassMessage_PromoteXSD.PropertyName) = "shuxing";

l         发送形状Send_1

消息设为new_netClassMsg

l         端口SendPort

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

5.    编译部署项目

编译整个解决方案,然后部署整个解决方案(如果已经做过前面的“只使用.net class消息的示例”,请在biztalk administrator中把netClassMessage应用删除)。

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

6.    设置物理端口

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

对应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" encoding="utf-8"?>

<ns0:ClassSchema xmlns:ns0="http://netClassMessageProcessProject.ClassSchema">

  <ID>ID_0</ID>

  <Name>kent</Name>

  <Address>Address_0</Address>

  <PropertyName>shuxing</PropertyName>

</ns0:ClassSchema>

 

 

posted on 2007-03-10 00:01 chnking 阅读(2386) 评论(9) 编辑 收藏

评论

#1楼 2007-03-10 10:06 shenfx      
写得非常好!您的文章结构清晰细节详细,又让我学到了不少东西。
 回复 引用 查看   

#2楼 2007-03-10 15:26 JesseZhao      
文章写的很专业啊
 回复 引用 查看   

#3楼 2007-03-10 21:44 阿新      
如果要在Biztalk的orchestration调用或是定义.net类型的话是必须在类的头上标注[Serializable],但如果在.net类中存在复杂类型的属性时好像就不行了,比如加上一个public XmlDocument XmlInstance;这样的类型就会报错;
 回复 引用 查看   

#4楼 2007-03-10 21:46 阿新      
所以我一般的做法是,如果要在orchestration中调用.net类,最好是使用静态方法,通过这个静态类,在作具体的实现
 回复 引用 查看   

#5楼 2007-03-11 16:43 shenfx      
请问您新建的ClassSchema.xsd架构既然已经是与.net class类型相对应的了(如五.2小节所写),那么您在六.1小节所写的用xsd.exe文件序列化net class文件还有什么意义呢? 序列化出来的结果不就是ClassSchema.xsd吗?net class类型消息的实例直接通过ClassSchema.xsd生成不就行了吗?感觉好像绕了一个圈。
 回复 引用 查看   

#6楼 2007-03-11 16:46 shenfx      
您能不能再说说具体在什么情况下使用.net class类型呢,向您文中的所讲的完全就是.net class类型的使用方法,实际应用中没有必要这么麻烦,通过xml消息能够应付多数的情况。所以您能不能说说.net class类型的典型应用场景。
 回复 引用 查看   

#7楼[楼主] 2007-03-11 17:31 chnking      
这几篇文章只是说可以在orchestration中使用.net class类型的消息以及如何使用,并没有谈论为什么需要这么用。
老实说,这么用是相当麻烦,我也想象不出哪种场景必须要这么用。但是实际情况往往很难说,有时候说不定还真能用上,这里把老外对为什么要用.net class类型的消息给出的理由贴出来你参考参考:
The may be benefits in some cases in using .NET classes as opposed to XSD types for BizTalk orchestration messages. Here are some potential reasons:-
• Allow orchestrations to directly process any message content type, including non-XML. Converting non-XML content to XML is a more common approach (supported, for example, by the FlatFile Disassembler) but custom classes are the only viable approach in some situations.
• 'Smart' messages. You can build message-specific business logic into your message types. You would typically do this as an alternative to handing off your orchestration code to external ‘helper’ code. This approach is more object-orientated and structured. There are lots of potential uses, including efficient message validation, cleansing, enrichment, transformation etc. Of course, this overlaps with what you might do with maps, functoids etc., and there are some obvious pros and cons here. Maps may be more maintainable and easier to change, but may be less efficient and, in some cases, harder to code.
• Easier message construction. If you are constructing messages in an orchestration, they can sometimes be easier to build than using XML. You can implement Factory design patterns on your .NET classes for this purpose.
• Easier to handle in the Rules Engine. It is fundamentally easier, and generally more efficient, to assert .NET objects as facts instead of XML documents in the Microsoft BRE. For orchestrations that make heavy use of the BRE, this can be beneficial.
 回复 引用 查看   

#8楼[楼主] 2007-03-11 17:49 chnking      
“那么您在六.1小节所写的用xsd.exe文件序列化net class文件还有什么意义呢? 序列化出来的结果不就是ClassSchema.xsd吗?”
只是我的示例做的.netclass类和xsd一一对应了,实际情况中这两个类型可以相差很大,只是其中一些属性对应。
 回复 引用 查看   

分享中



ET电子技术网
http://www.et-dz.com/html/dianzhijxwz/index.html
 回复 引用