1.3. 引用netClassMessage_PromoteXSD项目
3. 在.netclass类型消息项目中新建xml消息实例和读取xml实例的方法
一. 本示例的用途
本示例演示如何在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_netClass”assembly,窗口右边会出现这个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项目的将被部署到biztalk的netClassMessageToXSDMessage应用程序中,类库项目也会被部署到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消息类型的assembly为netClassMessage_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
<?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>