原文转自:http://bbs.cnw.com.cn/viewthread.php?action=printable&tid=167493
这里感谢 原作者
BizTalk开发系列(一) "Hello World"。
学习开发语言的时候很喜欢输出“Hello World”作为第一个程序。今天我们也在BizTalk 上创建一个简单的 "Hello World" 程序。
BizTalk的时候有很多文章都是教你如何使用Visual Studio开发BizTalk 的第一个应用程序的。今天我们来换一种思路开发基于BizTalk的"Hello World"应用程序。也就是直接通过BizTalk 管理控制台创建应用程序。
BizTalk Server 管理控制台
安装和配置BizTalk之后就可以通过BizTalk控制台管理BizTalk Server 及应用程序。其中有几个概念先了解一下:
BizTalk Group: BizTalk Server 的逻辑概念,可以将多台BizTalk Server加入一个Group进行管理。
Applications: 开发BizTalk应用程序之后它在此节点下。
Platform Setting :BizTalk运行环境的配置比如BizTalk实例(BizTalk运行时的进程),BizTalk适配器等的配置。
查看控制台相关概念
BizTalk 组
BizTalk Group。控制台树中的“BizTalk Group”节点包含表示该 BizTalk 组的项目(应用程序、参与方和平台设置)的其他节点。BizTalk 组是一种组织单位,通常表示企业、部门、中心或需要包含的 BizTalk Server 实现的其他业务单位。BizTalk 组与 BizTalk 管理数据库具有一对一关系。
在 BizTalk Server 管理控制台中选择“BizTalk 组”节点后,BizTalk Server 组中心页将显示在详细信息窗格中。BizTalk Server 组中心页提供 BizTalk Server 系统运行状况的总体概况。
应用程序 [隶属于BizTalk Group]
业务流程。业务流程通过使用业务流程设计器进行设计,并部署到 BizTalk 组中。
角色链接。角色链接定义消息定义的角色与双向交互中使用的端口类型之间的关系。
发送端口组。发送端口组是一组指定的发送端口,使用这组发送端口可以在单一配置中将同一条消息发送到多个目标。
发送端口。发送端口是用于发送消息的 BizTalk 对象。
接收端口。接收端口是相似接收位置的逻辑分组。
接收位置。接收位置定义为接收入站文档的特定地址与 BizTalk Server 管道(处理在该地址上接收到的消息)的组合。
策略。策略是业务规则的版本控制**。
架构。架构是消息的结构。一个架构可以包含多个子架构。
映射。映射是定义一个规范中的记录和字段与另一个规范中的记录和字段之间的对应关系的 XML 文件。映射包含一个可扩展样式表语言 (XSL) 样式表,BizTalk Server 可使用该样式表执行该映射中所描述的转换。
管道。管道是一种软件基础结构,用于定义和链接一个或多个处理阶段,并按指定顺序运行这些阶段以完成特定任务。管道将处理过程分为多个阶段,阶段是对一类工作的抽象描述。管道还确定了执行每类工作的顺序。
资源。资源可以是脚本、部署的程序集或与应用程序相关联的其他文件。
BAS 项目。业务活动服务 (BAS) 项目为应用程序提供了一种与外部合作伙伴进行交流的方法。BAS 项目由合作伙伴配置文件(也称作参与方)、合作伙伴组、协议和 Microsoft Office InfoPath 模板组成。必须首先使用 BAS 站点创建 BAS 项目,然后才能将 BAS 项目导入 BizTalk Server 管理控制台并在其中显示。
参与方。参与方是位于 BizTalk Server 之外与业务流程进行交互的实体。与您的组织有业务关系的所有合作伙伴都可视作参与方,而您的组织可能有数千个合作伙伴。
平台设置
“平台设置”节点包含主机、主机实例、MessageBox 数据库和适配器等子节点。
主机。“主机”节点包含 BizTalk Server 环境中所有的进程内主机和**主机。BizTalk 主机是诸如适配器处理程序、接收位置(包括管道)和业务流程等项的逻辑容器。。
主机实例。“主机实例”节点包含当前 BizTalk Server 组中的所有主机实例。主机实例是执行应用程序组件的 BizTalk Server 运行时进程。使用“主机实例”节点,可以创建新的主机实例和刷新主机实例信息。
服务器。“服务器”节点列出了加入 BizTalk Server 组的所有服务器。它们是安装和配置 BizTalk Server 以及运行主机实例的计算机。通过将服务器与特定主机相关联可以创建主机实例。
MessageBox。“MessageBox”节点包含当前 BizTalk Server 组使用的所有 MessageBox 数据库。使用“MessageBox”节点,可以创建新的 MessageBox 数据库和刷新 MessageBox 数据库信息。MessageBox 数据库是在执行协作处理的服务器间实现工作项负载平衡的基础。工作项在其整个处理过程中可能会多次通过 MessageBox 数据库。MessageBox 数据库的名称不得超过 100 个字符。
适配器。“适配器”节点包含为 BizTalk Server 组和关联适配器处理程序配置的所有发送和接收适配器的子节点。适配器是用于在终结点之间发送和接收消息的消息传送中间件。
看了这些概念可能还是云里雾里的。不过没关系BizTalk不是那么好理解,特别是刚开始学习的时候。因为它的开发理念和程序语言有点不太一样。它是面向消息的开发理念。之前跟一些学习BizTalk新人聊的时候。常常会听到“我学习BizTalk 一个星期了,还不知道它干嘛用。”。 而后来跟一位BizTalk MVP聊的时候我提到了这一点。他也很搞笑的说“我当时搞了三个月了还不知道是干嘛用的”。所以不要急于求成。
开始开发
1. 首先打开BizTalk 服务器管理控制台,在Applications节点右击选择新建->应用程序.在弹出的对话框的名字栏里填上应用程序名称:Hello Word
2. OK,应和程序Hello World已经建了,只不过它什么都干了了。我们会在Hello World节点下看到很多节点。每个应和程序都会有这么多的节点。这些节点都跟BizTalk的架构的关的,暂时先不用了解那么细致。
3. BizTalk像是一个盒子用于处理消息。因为就需要有进入的消息和出来的消息。那样我们首先创建一个接收的端口用于接收消息。
在Receive Port 节点右键->新建->单一方向端口,在常规选项卡里写上端口名称:ReceiveFiles。
4. 端口是BizTalk的逻辑概念,真正接收的地方是在 "Receive Location"节点下配置的。在ReceiveLocations节点下右键->新建->单一方向接收地址.在"选择接收端口"的对话框中选择刚才新建的端口"ReceiveFiles"。
5. 在接收位置的配置页,填上接收位置的名称。在类型中选择File, 接收管道选择PassThruReceive。
6. 点击类型的Config按钮,弹出File的配置对话框配置接收位置,以及相应的文件名称。
7. 创建好了接收端口,接下来我们来创建发送端口。发送端口直接指定发送的物理位置和发送方式。多个发送端口使用Send Group进行管理。
右击Send Ports 节点->新建->Static One-Way Send Port
8. 在发送端口配置菜单中参照下图分别配置:发送端口名称,类型,相应类型的发送位置。
9. OK,现在端口已经全部创建完成了。现在是万事俱备只欠东风。现在你会不会有这样一个问题:怎么让接收到的消息由发送端口发送出去?也许你会认为它们同在一个应用程序下面直接就可以实现了。但同一个应用程序下面可以创建许许多多的发送的接收端口那BizTalk怎么去判断消息从哪接收又发送到哪呢?。
呵呵,带着问题,我们来看看可能怎么将接收端口和发送端口关联起来。再次打开发送端口配置对话框,我们会注意到左边的菜单项中有一个叫“Filter”(过滤)。我们就用这个来实现发送端口与接收端口的关联。在条件表达式中设置: BTS.ReceivePortName == ReceiveFiles
10. 启动BizTalk 应用程序验证程序
右击Hello World应用程序选择Start。打开刚才配置的接收文件夹。将测试XML文件 QuickLearn.CN.Msg.XML拷贝到接收文件夹In中。
在Out 文件夹中查看输出
我们的第一个BizTalk 程序已经成功运行了,感觉怎么样。是不是很神奇。虽然很多理论性的东西没有讲到。但是对于初学者来讲往往兴趣更重要。另外这个程序还可以改为用于搬运文件,或者不需要走流程的业务中。它的专业术语叫“直通流程”。我是在学习BizTalk三个月之后才知道这个东西的。记住这个Sample,在以后的BizTalk学习过程中慢慢理解这个Sample以及BizTalk的架构思想。
BizTalk开发系列(二) "Hello World" 程序搬运文件。
我们在<QuickLearn BizTalk系列之"Hello World">里讲到了如何快速的开发第一个BizTalk 应用程序。现在我们来讲一下如何把这个程序改成用于搬运文件的程序。
我们的设想是:不管文件的类型是什么,将文件从In 文件夹搬到 Out 文件夹。我们来看看应该怎么实现这个设想。
首先我们会发现"Hello World"程序在接收位置的文件名称是" *.XML".也就是说它只接收XML文件类型的文件。既然它支持通配符的表达式那么我们就可能把这里改为:" * "也就是说让它支持任何类型的文件。(在Windows系统中允许文件没有扩展名,所以我们就用*让它代表所有的文件)
我们的测试数据有三种类型的文件,分别是:XML, ZIP, Gif。现在我们将这三种类型的文件拷贝到In文件夹。再看看输出文件夹:
[输入文件]
[输出文件]
很显然,我们输入的文件都已经被输出到正确的目标下了。也就是说BizTalk成功的路由了消息。但是这跟我们设想的还有点差距。输出的文件中除了XML类型的消息可以被正确访问之外。其他文件需要更改为相应的文件后缀才可以被访问。但我们希望的是输入的文件在输出的时候还能够保持原样(文件名,文件大小,文件类型)。那么我们接下来就要在发送端口做一下改变了。做什么改变呢?我们要让BizTalk输出文件的时候保持原有的文件名和后缀。
打开发送端口的类型配置对话框。我们会发现在文件名的表达式里有一个特别的关键字“%MessageID%”。这个表达式其实是BizTalk的宏,它表示的是这个消息在BizTalk中的ID号 。也就是说在执行的时候它会被真实的值给替换。
现在我们将这个表达式改为: %SourceFileName% . 这个宏的意思是保留原文件名称。
OK,现在我们配置好了。我们来看一下执行的效果。我们发现文件按照原有文件名被输出出来,而且可以被正常访问。
注意事项:本文主要是为了讲如何实现这一需求。在生产环境中使用该方法要考虑更多的因素:
文件大小 对于消息的处理需要对服务器做进一步的调整,目前微软官方已经测试通过了 2G的单文件。
数据库的维护 BizTalk的所有消息都是保存在BizTalk数据库里的所以要做好BizTalk 数据库的管理
系统稳定性 如果处理的文件过大,过多会造成系统的不稳定。
系统性能 不同的适配器性能表现不一样。
BizTalk开发系列(三) 单机环境下的BizTalk Server 2006 R2安装。
大部分的开发环境都是在单机环境下进行的,今天整理了一下BizTalk Server 2006 R2在单机环境下的安装步骤。1. 软件需求
在**服务器中完整安装BizTalk Server 2006 R2的基本软件需求
Windows 2003 Server with Service Pack 2 (SP2), or Windows 2003 Server R2
Microsoft Office Excel 2003 and InfoPath 2003 with Service Pack 2
Microsoft Visual Studio 2005 with Visual C# .NET
Microsoft SQL Server 2005 with Service Pack 2 or Microsoft SQL Server 2000 with Service Pack 4
Microsoft SQL Server 2005 Analysis Services with Service Pack 2 orMicrosoft SQL Server 2000 Analysis Services with Service Pack 4
Microsoft SQL Server 2005 Notification Services with Service Pack 2 orMicrosoft SQL Server 2000 Notification Services 2.0 with Service Pack 1
Business Activity Services (BAS) 需要安装 Microsoft WindowsSharePoint Services 2.0 with Service Pack 2 (WSS SP2) is installed. BAS仅支持 WSS SP2.
Windows SharePoint Services (WSS) 适配器 Web Service需要安装以下组件之一:
Microsoft Windows SharePoint Services 2.0 with Service Pack 2
Windows SharePoint Services 3.0
Microsoft Office SharePoint Server 2007 (MOSS)
安装RFID的软件需求
Microsoft .NET Framework 3.0
Web Services Enhancement (WSE) 3.0
Microsoft Message Queuing service (MSMQ)
Microsoft Management Console (MMC) 3.0 version
2. 安装必备组件
| 步骤/任务 | 注释 |
| 步骤 1: Windows Server 2003 R2 + SP2 | 建议在安装之后新建一个Administrators组的帐户用于BizTalk Server 的运行。 |
| 步骤 2:安装 Internet 信息服务 6.0 | 启用 ASP.NET |
| 步骤 3:安装带 Service Pack 2 的 Office Excel 2003 和 InfoPath 2003 | 使用默认设置进行安装 |
| 步骤 4:安装 Visual Studio 2005 安装 .NET Framework 3.0 / 3.5 | 安装 Microsoft C# 和 Framework SDK |
| 步骤 5:安装 SQL Server 2005 | 使用默认设置进行安装 如果有SQL Server 2005 SP2的话也一并装上。 |
| 步骤 6:安装并配置带 Service Pack 2 的 Windows SharePoint Services 2.0 | 安装类型必须为 Server Farm |
| 步骤 7:将默认网站扩展为虚拟服务器 | 对于安全类型选择 NTLM。业务活动服务不支持 Kerberos 验证。 |
| 步骤 8:为业务活动监视 (BAM) 警报创建网络共享 | 创建名为 Alerts 的共享 授予 Everyone 对此共享的 Change 权限 |
安装完成之后会链接到WSS配置网站配置WSS的应用程序池和管理数据库。您也可以自己通过点击开始->程序->管理工具->SharepontAdministration打开该站点.下图显示的是新建配置WSS运行池"WSSAppPool",使用Administrator的身份运行。
接下来继续配置WSS的管理数据库。主要是要填上数据库服务器名称和数据库名称。

扩展站点,配置好WSS管理数据库之后在控制台选择扩展或新建站点。在显示的列表中选择要扩展的站点,默认为默认站点。在配置内容数据库页面配置相应的应用程序池和数据库即可。
再次点击新建或扩展Web应用程序刚才的站点已经不在列表中。则表示扩展已经成功。在IIS的默认站点的属性里可以看到在ISAPI菜单下新增加了一个Sharepoint 的ISAPI筛选器。
4. BizTalk Server 2006 R2安装过程
BizTalk 的安装过程比较简单。在点击Setup之后会有服务协议、用户名称等信息需要配置。另外在安装之前最好先将BizTalk所需的CAB包下载好。这样可以大大的加快安装进度。另外还可以方便下重复利用。
组件选择,一般开发机选择所有组件。以适应不同的BizTalk需求。 
5. BizTalk Server 2006 配置
BizTalk Server 2006 R2支持两种配置方式。这两种配置方式是有一定区别的。但对于一般的开发环境只需要采用基本配置即可。这样可以节省很多时间。
基本配置的注意事项
使用基本配置来配置 BizTalk Server 2006 时,请注意以下事项:
不支持配置远程 SQL Server。
支持根据 SQL Server 2000 和 SQL Server 2005 默认实例和命名实例配置 BizTalk Server 2006。
注意
不支持 SQL Server 2000 Analysis Services 的命名实例。在配置过程中,必须使用 SQL Server 2000 Analysis Services 的默认实例。
登录所用的帐户必须是本地 Administrators 组的成员,并拥有对 SQL Server 的系统管理员权限。
登录所用的帐户必须为 OLAP 框中的 OLAP Administrators 的成员(如果配置的话)。
不能使用基本配置在 SQL Server 命名实例上配置 BAM 分析。如果您使用的是命名实例,并且希望配置 BAM 分析,则应使用自定义配置管理器。
如果使用 BizTalk Server 管理控制台来管理 BAS 项目,则必须在运行 BAS 网站的计算机上和运行 BizTalkServer 管理控制台的计算机上为 Microsoft 分布式事务处理协调器 (DTC) 启用事务 Internet 协议 (TIP)事务。默认情况下,Windows XP SP2 和 Windows Server 2003 将禁用 TIP 功能;而在 Windows2000 Server 中,安装安全更新 902400 之后会禁用 TIP 功能。若要启用 TIP 功能,请按照http://go.microsoft.com/fwlink/?LinkId=58318 中所述步骤进行操作。
自定义配置
使用自定义配置来配置 BizTalk Server 2006 时,请注意以下事项:
登录所用的帐户必须是本地 Administrators 组的成员,并拥有对 SQL Server 的系统管理员权限。
自定义配置管理器中列出的由 BizTalk Server 生成的默认帐户是本地组。在多服务器环境中,必须用域组替换本地组。
登录所用的帐户必须为 OLAP 计算机中的 OLAP Administrators 组的成员(如果配置的话)。
使用基本配置
运行的帐户必须具有管理员权限,建议新建一个专门用于BizTalk运行的账户。以防管理员密码更改之后BizTalk运行不正常。另外还要注意的是不对BizTalk运行的服务器改名。不对BizTalk运行的用户更改密码。因为这样导致BizTalk 不能正常运行,而且修复也非常麻烦。
在基本配置向导的配置过程中可以会出现有些组件不能正常安装。需要根据相应的错误提示更正错误。
BizTalk 配置向导会在配置完成之后产生配置的报告,可以通过配置向导对失败的组件进行重新配置或安装。
再一次运行配置向导的时候会显示各组件的状态。
全部安装成功,可以还导出配置以便以后管理需要。注意,导出的配置里面不会保存用户密码。在导入的时候需要重新设置用户的密码。
6. 安装之后的验证 
[增加了一些菜单]
[BAM站点可以正常访问]
[Visual Studio 新增BizTalk Project模板]
[增加了BizTalk Server数据库]
[BizTalk Server 管理控制台]
BizTalk开发系列(四) 深入Map测试。
在BizTalk的开发过程中XML消息间的映射是一个很重要的内容。如果只是一般的从源节点的值复制到目标节点的话,BizTalk项目提供的MAP测试和验证就已经可以满足需求了。但是很多时候需要在映射的过程中进行复杂的处理。比如节点值的组合运算等。幸好VisualStudio提供了对XSLT的测试功能。在BizTalk的开发过程中可以借助此功能做到Map的"单步"调试。下面我们分别看一下Map的简单测试与高级测试。
简单Mapping测试
验证Map
右击选择Validate可以在“输出”窗口,查看到关于Map的验证信息。
测试Map
右击Test map,Visual Studio会自动生成Map 的源消息,在输出窗口查看到关于Map的测试信息。
如果要用自定义的消息做测试实例的话。可以右击选择属性,在属性窗口的TestMap Input Instalce 和 TestMap Output Instance分别输入相应文件的路径。
高级Mapping测试
在实际的开发过程中,经常需要对Map做一些自定义的开发。为此BizTalk 的Map编辑器提供了ScriptFunctoid,支持C#.NET, JScript.NET, Visual Basic.NET, 可扩展样式表语言转换 (XSLT),XSLT调用模板。如果使用“简单测试”的话,调试这些脚本就会很麻烦。因为有时我们需要知道输入参数和输出参数的值,脚本的执行情况等信息。以帮助我们改进脚本。
如果您有做过验证Map的时候,您会发现在输出窗口会提示生成了相应的XSLT文件(注:XSLT是一种转换语言)。VisualStuido可以支持XLST的调试。我们就下面Sample,讲一下如何使用Map生成的XSLT文件去测试Map.(注意:对XSLT文件的修改不会应用到相应的Map文件中)
如下图所示,我们在Map中使用自定义脚本:内联XSLT和C#。
内联XSLT的脚本代码
<xsl:if test="MainRecord/SubRecord/@AttributeA = 'AttriA'">
<FieldB>
<xsl:value-of select="MainRecord/SubRecord/@AttributeA" />
</FieldB>
</xsl:>
内联C#的脚本代码
public string MyConcat(string param)
{
return param.Trim();
}
1.右击Map文件,点击“验证”
2.在输出窗口中按住Ctrl, 点击后缀为 XSL的文件。
3.在打开的文件上右击"查看源码"
4.此时我们可以发现在XSL编辑器的左边可以设置断点,并且菜单上多了一个"XML"菜单。
5.在属性中设置好XSLT的输入和输出文件
6.点击"调试XSLT" 就可以单步调试XSLT,在右边的输出文件窗口还可以实时的看到轮换的效果。
7.在监视栏可以输出变量的信息,运行到Template的时候还可以直接输入Xpath查询语句验证输出。同时鼠标移到选取字段的时候还可以看到当前变量或语句的值。
XSLT中的脚本支持是微软对XSLT语言进行了扩展增加了<msxsl:script>元素,所有自定义脚本生成的时候都会在此节点,如下面的代码。
<msxsl:script language="C#" implements-prefix="userCSharp"><![CDATA[
public string MyConcat(string param1, string param2)
{
return param1+param2;
}
]]></msxsl:script>
有了以上的测试方法我们就可以很方便的找到Map中的Bug,但是对于外部程序集的测试的时候,只能通过"简单测试"的Test Map方法进行,因为Map将对程序集、类和方法的引用放置在与生成的样式表相关联的扩展对象文件中,并在运行时才对其进行调用。因此您可以编写自定义内联Functoid以方便测试。当然开发就麻烦点。
BizTalk开发系列(五) 属性字段。
在根据消息内容进行路由的时候经常使用的是可分辨字段和属性字段。属性字段可以在各个 BizTalk Server组件(包括管道和业务流程)中进行访问。属性字段还可用于消息路由。如果需要在上下文(而不是在业务流程)中访问升级的消息数据,必须创建一个或多个属性架构来描述要升级的数据。
消息上下文中的每个属性均由以下三个部分构成:名称、命名空间和值。例如:
<Property Name="InterchangeID"Namespace=http://schemas.microsoft.com/BizTalk/2003/system-propertiesValue="{AC07BF30-2F1A-42B0-8390-191EF38BA839}"/>
现在我们来谈一下属性字段的使用,“属性字段”的方法升级属性需要创建属性架构。所有属性升级作都是通过“升级属性”对话框来完成。您可以通过使用消息架构中 Schema 节点的“升级属性”来访问该对话框。
1.创建属性架构
属性架构是一种与消息架构相关联的特殊架构。它用于将实例消息中的特定值升级到消息上下文中。属性升级提供了一种集中机制,通过该机制,您可以从实例消息中请求所定义的关键信息,并使其可更方便地被负责对通过 BizTalk Server 的消息进行处理的 BizTalk Server 组件访问。
2.升级属性字段
在“升级属性”对话框中,确保已选中对话框右侧的“属性字段”选项卡。然后,确保相应的属性架构已包含在“属性字段”选项卡顶部的“属性架构列表”中。如果需要,请使用文件夹按钮通过“BizTalk 类型选取器”对话框来选择相应的属性架构。
接下来,展开对话框左侧的架构树中的节点选择您要升级为属性字段的“字段元素”节点或“字段属性”节点,然后单击“添加”。最后,使用“属性-字段字典”表的“属性”列中的下拉列表选择属性架构中与升级属性关联的“字段元素”节点。
3.属性字段的使用
设置完属性字段与架构元素或属性之间的关联之后,即可在通过访问消息的上下文属性访问或设置该属性的值。注意消息的架构与升级为属性字段的架构一致。
可以将属性架构中的“记录”节点升级为“字段元素”节点,但只有在“记录”节点的“内容类型”属性设置为 SimpleContent 的情况下才可进行此操作。
在一个架构中,可以对同一属性升级多次,只要所有这些升级都是在不同的根节点下进行即可。这是因为消息是根据单个根节点进行验证的,只有在该根节点下升级的属性才会在运行时进行评估。
升级为属性之后会添加两部分
4.测试属性字段及其在路由中的应用
输入的XML消息
<ns0:Root xmlns:ns0="http://MultiPartMsgTest.Sch_One2">
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
</ns0:Root>
在发送端口的筛选器中使用升级属性,用于路由消息。
在发送商口设定不同的输出文件名
验证消息处理
5.可分辨字段与属性字段的区别
下表概括出了属性字段与可分辨字段之间的区别,可如果需要更灵活的基于内容的路由可以采用属性字段,如果只是关键节点值的读取与赋值的话则可分辨字段比较合适。
| 属性 | 属性字段 | 可分辨字段 |
| IsPromoted 属性 | True | False |
| 大小限制 | 255 个字符 | 无限制 |
| 用于路由 | 是 | 否 |
| 用于跟踪 | 是 | 否 |
| 在业务流程中使用 | 是 | 是 |
| 需要属性架构 | 是 | 否 |
| 可通过管道和端口进行访问 | 是 | 否 |
作者: ttggl 时间: 2009-5-25 12:25
BizTalk开发系列(六) BizTalk开发简述。
现在很多大型企业信息化程度很高,运行中的系统可达到数十乃至上百个。而大部分系统由于建设的时间、开发团队和技术往往不相同,系统之间的大部分都是**运行的。随着信息化建设的深入各系统之间的交互需求越来越紧迫。但是由于信息化的建设不可能一触而就,也不可能再组建一个团队把所有的系统重构。因此需要一个系统与系统之间交互的中间件。
BizTalk就是这样一个中间件。它本质上是一个消息处理引擎,处理消息验证,映射,业务流程等。以下是BizTalk的运行时高度概括结构,了解其结构可以在更有针对性的开发相关业务。
BizTalk运行时通过适配器能接收端口接收数据创建消息,经接收管道处理比如升级消息里的内容为消息属性复制到消息上下文等。消息经处理管道处理之后将会存储到MessageBox数据库。下一步将决定消息的传送目标,在BizTalk系统中消息可以传给业务流程处理也可直接传往发送端口。不管目标为哪一个,BizTalk都是采用发布订阅机制,每个订阅方都会从BizTalk消息引擎中获得消息的副本。最终消息由发送管道处理之后由发送适配器以相应的格式发送到目标。
BizTalk主要开发内容
消息
BizTalk的消息指的是XMl文件、二进制文件、SOAP消息等所有的格式。但在BizTalk内部唯一使用XML文档。每个消息都可以可以视为一个多部分消息,此类消息可以由一个或零个消息组成。所有消息在BizTalk中都是不可改变的,这就意味着消息在构造之后就不可以再改变(这点在开发过程中很重要)。系统的每个消息都带有一个属性集,包括消息ID,接收端口,实例ID等信息。消息的属性可以通过管理控制台查看。
实际开发过程中主要定义消息的格式,由于BizTalk内部唯一使用XML文档因此主要通过Schema编辑器定义XSD(XML架构定义语言)。建议熟悉XSD定义。
映射
映射由多个底层组件组成,并依赖于已创建的架构。这些架构又依赖于 XML 架构定义 (XSD) 语言。在开发映射过程中如果懂得XSLT语言则会更加方便。
适配器
适配器是一种软件组件,可以使用符合可识别的常用标准的传输机制通过 BizTalk Server 便捷地发送或接收消息:SMTP、POP3、FTP 或 Microsoft 消息队列(MSMQ)。BizTalk Server 2006 包含以下类型的适配器(也称为“本地”或“集成”适配器):基本 EDI、BizTalk消息队列、FILE、FTP、HTTP、MQSeries、MSMQ、POP3、SMTP、SOAP、SQL,以及 WindowsSharepoint Services。
每个本地适配器均关联有一个接收位置,用于在特定地址侦听来自特定传输的消息。在接收位置收到消息后,消息将传递给适配器。适配器将向消息(通常在消息的正文部分)附加数据流,添加有关接收数据的源终结点的所有元数据,然后将消息提交到 BizTalk 消息引擎。
由于BizTalk提供的适配器已基本满足需求,如有特别需求可以参考SDK文档进行开发。
管道
尽管初始消息是由适配器创建的,但对收到消息的处理过程大部分发生在接收管道中。管道处理针对消息内容以及消息上下文。对消息内容的处理通常发生在解码、拆装和验证阶段,而对消息上下文的处理则可发生在所有阶段。
BizTalk提供了比较方便的管道开发方法,通过继承BizTalkSDK提供的接口将消息流接收过来,经过处理之后再返回接口即可。无需涉及事务,大消息等复杂的内容。因此如需对消息进行底层的开发(例如Excel数据流转为拆装器可识别的XML数据流,针对XML消息添加命名空间等操作)大部份是在管道中进行。
业务流程
业务流程是用于表示可执行的业务程序的灵活且功能强大的工具。您可以在直观可视化绘图中设计流、解释和生成数据、调用自定义代码以及进行所有处理。
消息、作用于消息的发送和接收操作以及传输消息的端口都是业务流程的基本元素。消息是业务流程与外界进行通信以及实施电子商务的媒介。
业务流程不但跟实际的需求关系紧密而且需要了解的技术也比较多。主要有以下几个需要了解的技术:事务,相关集,多部分消息,类型(端口,多部分消息)。还有应熟悉业务流程设计器提供的各种形状,这些形状表示了业务流程的逻辑流。
作者: ttggl 时间: 2009-5-25 12:26
BizTalk开发系列(七) Hello World2。
之前根据BizTalk的订阅原理,使用BizTalk管理控制台创建了第一个应用程序 HelloWorld。但是由于控制台的开发功能有限,绝大多数的BizTalk程序都是在集成开发环境VisualStudio下进行的。下面我们在Visual Studio下创建HelloWorld2程序。其功能是将源消息的两个字段组成第三个字段并保存到目标消息。[效果图如下]

此程序主要是为要熟悉BizTalk相关的开发组件包括:Schema, Mapping , Pipeline, Orchestration的开发。Receive/Send Port的配置等。以下是开发的一些步骤:
1.创建应用程序
打开Visual Stuido,依次点击 文件->新建->项目. 在程序名称和路径中填上相应的名称和路径。点击确定创建应用程序
2.创建架构(Schema)
右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Schema文件,在右侧的模板中选择Schema.在名称中选择输入Schema的名称。
在打开的Schema编辑器中右击Root.依次点击 Insert Schema Node->Child Field Element.
作者: ttggl 时间: 2009-5-25 12:26
依次创建两个子元素,并命名为:para1和para2(元素默认为字符串值)。Schema命名空间按默认值。
按以上方法创建目标Schema.文件名为:TargetSchema.架构视图如下:
2. 创建映射(Map)
右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Map 文件,在右侧的模板中选择Map.在名称中选择输入Map的名称。
在打开的编辑器的左侧窗口中点击 Open Source Schema在打开的对话框中选择BTSHelloWorld2.SourceSchema.在右侧窗口点击Open Destination Schema.在打开的对话框中选择BTSHelloWorld2.TargetSchema.
打开源与目标架构之后,依下图连接源与目标节点。目标架构的string节点是由para1和para2连接而。在map编辑的工具窗口选择String Concatenate Functoid.
3.创建业务流程(Orchestration)
作者: ttggl 时间: 2009-5-25 12:27
3.1 如前所述。右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Orchestration 文件,在右侧的模板中选择Orchestration.在名称中选择输入Orchestration的名称。
3.2 创建消息。打开Orchestration文件,在OrchestrationView窗口中新建两个消息分别为:SourchMsg和TrgetMsg。其类型分别为:BTSHelloWorld2.SourceShema和BTSHelloWorld2.TargetSchema。如果当前编辑环境中没有OrchestrationView可以在View->Other Windows->Orchestration View中打开视图
3.3 创建和配置业务流程
如图中所示为已经配置完成的流程图形状,实现此流程需要做以下几步。
从工具栏中选择Receive , Transform , Send 三个形状以图中所示位置排列好。
在Receive形状的属性窗口的消息属性中选择刚才创建的SourceMsg。双击Transform在弹出的窗口中选择已存在映射并 在下拉框中选择BTSHelloWorld.StringMap.在Source和Destination中分别选择SourceMsg和TargetMsg。在Send 形状的属性窗口的消息属性中选择刚才创建的TargetMsg
在Receive形状的属性窗口的Active属性选择True.表示活动端口以激活业务流程实例
创建接收端口:从工具栏中选择Port形状,拖放到左侧Port Surface中.在端口配置向导中按照提示分别输入:端口名称,端口类型,“从此端口接收消息”“稍后配置”。
作者: ttggl 时间: 2009-5-25 12:27
创建发送端口:从工具栏中选择Port形状,拖放到右侧Port Surface中.在端口配置向导中按照提示分别输入:端口名称,端口类型,“从此端口发送消息”“稍后配置”。 
4 创建接收的发送管道(Pipeline)
4.1 接收管道(Receive Pipeline)
如前所述。右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Pipeline文件,在右侧的模板中选择Receive Pipeline.在名称中选择输入Pipeline的名称。
打开Receive Pipeline 从工具箱中选择XML disassembler组件,拖放到Disassemble阶段。
4.2 发送管道(Send Pipeline)
发送管道的创建方法和接收管道类似,只是在选择模板时选择发送管道。在Pipeline编辑器中选择 XML Assemble组件拖放到Assemble阶段。如下图所示:
5. 部署BizTalk项目
至此BizTalk的项目开发到这里就基本上完成了。可以生成项目文件看有没有错误信息。接下来需要将BizTalk项目部署到BizTalk主机中。由于BizTalk的程序集需要安装到GAC(全局应用程序缓存)中。所以需要给程序集添加签名。方法是在Visual studio的命名窗口中输入如下命令:
作者: ttggl 时间: 2009-5-25 12:28
sn -k e:projectsbtshelloworld2btshelloworld2.snk
创建应用程序签名之后。在BizTalk应用程序的属性页的Assembly Key File里引用签名。
在配置属性的Build窗口里填上应用程序的名称,并验证服务器是否为本机。从别的机器上拷贝的程序需要注意这一点。
养成良好的习惯,配置解决方案的配置将程序的部署选择上。这对于较大的BizTalk开发有帮助。通过解决方案部署Visual Studio会判断程序之间的关系先后部署。
配置完之后右击解决方案。选择部署解决方案即可。
6. 配置和启动应用程序。
应用程序部署完之后,就可以在BizTalk管理控制台上看到相应的程序。右击该程序,选择配置。在配置应用程序页中分别为程序配置主机,接收端口和发送端口。
6.1 创建接收端口
由于接收端口稍微复杂一点。所以我们以创建接收端口为例。发送端口可参照接收端口的做法创建。首先在应用程序配置页的接收物理端口的下拉框中选择新建接收端口。在弹出的对话框中输入接收端口名称。在左边的导航栏中选择接收位置。在接收位置对话框中输入名称。接收管道选择自定义的接收管道名称(发送端口则选择自定义发送管道名称)类型选择FILE. 点击Config。在弹出的FILE传输对话框中输入接收位置。
作者: ttggl 时间: 2009-5-25 12:28
配置向导会显示相应完成的部分。都配置好之后,点击确定即可。
6.2 启动应用程序
右击应用程序点击启动。在弹出的对话框中再次点击启动。
7. 测试程序
BizTalk程序部署完成了。那下一步就是需要测试程序。测试程序需要源数据,这个源数据不需要我们手动创建。我们可以借助Schema编辑器的生成实例功能生成源数据。右击SourceSchema.选择Generate Instance
在Visual Studio的输出窗口中可以查看到生成文件的地址,打开文件并更改相应的内容。(如果想指定输出文件的路径。可以右击SourceSchema选择属性在对话框中的输出文件里填上文件的路径即可。)
<ns0:Root xmlns:ns0="http://BTSHelloWorld2.SourceSchema">
<para1>Hello </para1>
<para2> World!</para2>
</ns0:Root>
在配置的输出位置我们可以看到相应的输出文件。
8.总结
至此我们完成了整个程序的开发。此Sample涵盖了Schema, Map, Pipeline, Orchestration的开发。BizTalk应用程序的部署及配置等。希望以此都够让你对BizTalk的开发有个大概的了解。
作者: ttggl 时间: 2009-5-25 12:29
BizTalk开发系列(八) BizTalk Server 常识整理。
1.什么是BizTalk Server?
BizTalk 是业务流程管理服务器,用于连接人员,流程,有效管理和提升业务所需的信息。在原有版本业务
流程管理和SOA/ESB 的基础上,第5 个版本,BizTalk Server 2006 R2 帮助组织机构进一步扩展核心流程
管理技术。
2. BizTalk Server 2006 R2 有哪些新功能?
BizTalk Server 2006 R2 包含的新特性,解决主要垂直企业,如制造业和零售业的核心竞争力问题。这些功能包括
对电子数据交换(Electronic Data Interchange ,EDI)和AS2 以及 RFID 的支持。BizTalk Server 2006 R2 能够
与Microsoft Office 2007 系统和 Windows Vista®, 包括关键的 .NET 框架技术如Windows Workflow Foundation
和 Windows Communication Foundation 等相兼容。
如需BizTalk Server 20006 R2 功能相关的详细信息,请参见BizTalk Server 2006 R2 Key Capabilities 。
3.使用BizTalk Server 有什么好处?
扩展-达到每个边界的供应链
BizTalk Server 2006 R2 帮助组织机构有效的管理它们从工厂到店面的供应链。端到端的集成供应链允许组
织机构能够通过关键业务流程的可见度以及与商务伙伴的紧密协作来获得最大的效率。有了新性能如“对
EDI 和RFID 的全面支持”,BizTalk Server 2006 R2 使组织机构具备了最大化数据的采集面,以使业务流程
和商务伙伴实时可见的能力。
连接-统一平台的SOA 与互操作
BizTalk Server 2006 R2 为连接当前的应用程序(不考虑平台)和新的服务提供基础体系结构。这就使您能
够从投资中得到最大限度的回报,并最小化集成所需的技术而带来的成本。因为BizTalk Server 包含连接私
作者: ttggl 时间: 2009-5-25 12:30
有和标准系统的工具,并且与.NET 框架进行了预集成,所以BizTalk Server 是任何SOA 策略的核心。
另外,大量的技术和应用程序适配器可以用于BizTalk Server。由于对从传输协议如FTP, SOAP 和
MQSeries,到与商务应用程序如PeopleSoft, SAP, 和Siebel 的高层集成都能够提供即开即用的支持,您
只需选择需要与应用程序、平台或人员进行怎样的连接,我们就可以提供完成的工具。
• 商务应用程序适配器
• 基于WS-*标准
• .NET 框架(WCF, Windows SharePoint® Services, SQL Server™, Microsoft Dynamics™)
• 大型机和中等系统
• XML 和Web 服务协议(如SOAP)
• 设备(RFID)
交付-经过证明的企业级解决方案
BizTalk Server 是部署最广泛的业务流程服务器,接受来自各种规模的企业和行业关键任务流程的委托。
BizTalk Server 2006 R2 企业版为负载平衡提供内置支持,从而帮助企业对于企业内关键任务解决方案的交
付能力达到7*24 的级别。BizTalk Server 具有容错能力,可以部署易于配置和管理的SQL Server 群集来
保证没有单点失败。另外,由于具有一流的建立和配置能力以及对BizTalk Server 2006 核心框架的保留,
BizTalk Server 2006 R2 为当前BizTalk Server 2004 和 2006 的客户提供无缝的升级方式。无论您企业的
规模有多大,您都需要一流的体系架构。BizTalk Server 2006 R2 正可为您提供企业级的体系框架。
速览:
• 全世界超过7,000 客户
• Fortune100 的90%的企业使用BizTalk Server
• 在2007 Gartner 应用程序基础框架和后端应用程序集成的Magic Quadrants 评级领先者
作者: ttggl 时间: 2009-5-25 12:30
• 在2007 应用程序服务器平台:传统Web ,传统SOA 和**SOA 的Forrester Waves 市场调查中处 于领先
• 世界15 大零售商中有12 家采用BizTalk Server
4. 微软将如何利用BizTalk Server 进行下一步的发展?
BizTalk Server 是XML 和 Web Services 相关的最早产品之一。我们将继续利用新涌现的技术通过自动化
和管理业务流程来降低相关成本。我们将会致力于软件的开发,通过为用户提交软件产品来协调企业的业务
应用程序,人员和其商务伙伴,从而对其建立业务的方式进行革新。
5. 我如何在Windows Workflow Foundation 和 BizTalk Server for workflow 之间选择?
首先,Windows Workflow Foundation 和 BizTalk Server 都能提供对工作流的管理。在决定使用哪种技
术时,问题不是“一个对另一个的比较”,而是关于“根据我已有的和未来所需要的,如何才能让当前已建立
的工作发挥最大的优势”。我们的建议是充分考虑您所需要的工作流类型-例如,它是在一个应用程序内部,
还是应用程序之间或是企业之间。在这种情况下,您会发现您同时使用Windows Workflow Foundation 和
BizTalk Server 来解决问题。
6.BizTalk Server 2006 R2 版本
分支机构版(新)-该版本与企业版共同提供一个真正的“星型结构”的场景;分支机构版将帮助企业为智能
数据和流程共享建立新的局域网内的企业和部门的连接。
企业版-该版本针对企业客户和大型组织,它们寻求先进的具有无限扩展能力的BPM 和 SOA 平台。该版
本现在包括BizTalk 适配器和加速器,主机集成服务器(Host Integration Server ,HIS)), RFID 和 EDI。
标准版-该版本为中型企业或部门提供全面的BPM 和 SOA 解决方案,它也包括BizTalk 适配器和加速器,
HIS , RFID 和 EDI
开发版-仅限于设计、开发和测试解决方案,该版本为预生产环境的应用程序开发提供解决方案。
7.BizTalk Server 支持什么平台?
回答 Windows 2000, Windows XP Professional, Windows Server 2003, SQL Server 2000, SQL Server 2005,
Visual Studio 2005, .NET Framework 2.0。另外,BizTalk Server 对64 位提供运行时支持。BizTalk Server
也支持与非微软平台的互操作。通过它强壮的适配器框架,BizTalk 可以迅速的与专用系统连接。
8.BizTalk Server 如何与 Office System 产品如SharePoint 和 InfoPath 等共同工作?
在与InfoPath 相结合时,开发人员可以设计包括基于表单信息的结构化的工作流。BizTalk Server 能够对
InfoPath 提供支持,使用户可以:
• 通过web services 向 BizTalk Server 提交 InfoPath 文档
• 通过SharePoint Form Libraries 提交或接收 InfoPath 文档
• 操作InfoPath 表单内容建立新的表单
• 更新BizTalk Server 中现有表单信息
利用BizTalk Server 2006 R2,客户可以进入SharePoint Portal Server 来共享BAM 报告,管理业务伙伴
关系,在特定的业务流程自动化场景中增强人机工作流能力。
作者: ttggl 时间: 2009-5-25 12:32
BizTalk开发系列(九) MAP的连接方法。
BizTalk中的Map编辑器可以在源架构和目标架构创建连接。有三种创建连接的方式:
1.普通的连接方式,将左边的记录拖到右边。
2.根据结构自动连接,点击MAP的网格,在属性中选择结构(Structure)。
在将左边记录拖到右边时按SHIFT键。则该记录下的元素而会自动连接
3.根据节点名称自动连接,方法跟结构连接一样。只是在选择自动连接时选择 节点名称。
作者: ttggl 时间: 2009-5-25 12:32
BizTalk开发系列(十) ESB Guidance安装笔记
ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架。详细信息访问ESB指导工具包社区网站 。源码下载
ESB Guidance的安装过程非常复杂牵涉到的问题也是很多方面的。我也是装了数次之后才能成功。以下是安装时的笔记,安装时主要参照ESB Guidance的帮助文档,如果遇到问题可以查此笔记。
1. 安装UDDI不能选择SSL
2. DundasChart 组件运行问题(安装ESB Management Portal需要安装此组件才能显示统计图片)
The current trust level does not allow use of the 'compilerOptions' attribute.
Session state can only be used when enableSessionState is set to true,either in a configuration file or in the Page directive. Please alsomake sure that System.Web.SessionStateModule or a custom session statemodule is included in the<configuration><system.web><httpModules> section inthe application configuration.
解决办法:设置Web.Config, 在<System.Web>和</System.Web>之间加如下代码:
<!--From Windows Support Center-->
<trust level="Full" originUrl="" />
<httpModules>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
</httpModules>
<!-- Enable session state for all the pages in the Web application. -->
<pages enableSessi enableViewState="true"
作者: ttggl 时间: 2009-5-25 12:33
enableViewStateMac="true" validateRequest="false" />
3. Sharepoint报错
解决办法:去除SharePoint扩展站点的ISAPI筛选组件
4. 安装Microsoft.Practices.ESB.CORE.msi
BTSTask.exe ImportApp -Package:"C:Program FilesMicrosoft ESB Guidance1.0 - November 2007Microsoft.Practices.ESB.CORE.msi"/Environment:DEV_CORE /ApplicationName:Microsoft.Practices.ESB
msiexec.exe /q /i "C:Program FilesMicrosoft ESB Guidance 1.0 - November 2007Microsoft.Practices.ESB.CORE.msi"
重新所有BizTalk服务
5. 安装Microsoft.Practices.ESB.ExceptionHandling.msi
BTSTask.exe ImportApp -Package:"C:Program FilesMicrosoft ESB Guidance1.0 - November 2007Microsoft.Practices.ESB.ExceptionHandling.msi"/Environment:DEV_EXC /
ApplicationName:Microsoft.Practices.ESB
6. error " Incorrect syntax near ')' "
Go to "My Settings" on the portal and select an application.
7. Installed ESB Exception Notification
XsltPath. Point this setting to the folder containing the ESB PortalAlert Service (located by default within the %Program Files%MicrosoftESB Guidance Exception Notification Service 1.0 - November 2007folder).
作者: ttggl 时间: 2009-5-25 12:33
Enable Alert Queue Service. This setting indicates if the alertservice should run and check for new exceptions occurring that matchexisting alerts.
Alert Queue Polling Interval. This settingis the number of milliseconds for the alert service to wait betweenprocessing batches of alerts.
Alert Queue Batch Size. Thissetting is the number of exceptions that the alert service shouldprocess as one operation and match against existing exceptions.
Alert Queue Active Directory Cache Interval. This setting is theinterval at which the alert service should refresh its cache of ActiveDirectory information, including e-mail addresses and groupmemberships.
LdapRoot. This setting is the LDAP connectionstring for your domain controller; for example,LDAP://servername.domain.com/DC=domain, DC=com.
Enable AlertEmail Service. This setting indicates if the alert service should sendalert e-mail messages. If you disable this option, the service willstill process exceptions and store alerts in an outgoing e-mail queuetable. You may prefer to use this scenario if you implement analternative e-mail delivery service.
Email Server. This setting is the name of your e-mail server; for example, mail.domain.com.
Sender. This setting is the "From" e-mail address to use in alert e-mail messages.
Email Service Polling Interval. This setting is the number ofmilliseconds the e-mail service waits between sending each batch ofe-mail messages.
作者: ttggl 时间: 2009-5-25 12:34
Email Service Batch Size. This setting is the number of e-mail messages the e-mail service should process in a batch.
8. Installed ESB UDDI Publishing
9. Install the Sample Business Rules Engine Policies and Vocabularies
BTSTask.exe ImportApp -Package:"C
rogram FilesMicrosoft ESB Guidance1.0 - November 2007GlobalBank.ESB.Policies.msi"/ApplicationName:GlobalBank.ESB
10. Error 194008: An error occurred reading the, ESBProcessor/Resolver, Section in the config file
Check the Biztalk and Machine.config
11. IIS 要支持Keribors 认证
· 查看当前认证
cscript adsutil.vbs get w3svc/WebSite/root/NTAuthenticationProviders
· 设置认证方式
cscript adsutil.vbs set w3svc/WebSite/root/NTAuthenticationProviders "Negotiate,NTLM"
12. The Microsoft.BizTalk.ESB binding files are configured to workwith the default BizTalkServerApplication andBizTalkServerIsolatedHost, which are in turn configured to execute inuntrusted mode. If you have changed your host to run in trusted mode,the binding file will not import. To correct this, you must eitherchange the trust level to untrusted or edit the binding file to suityour environment.
作者: ttggl 时间: 2009-5-25 12:35
BizTalk开发系列(十一) 在Orchestration中执行Pipeline。
由于开发需要有时要在流程中执行Pipeline。比如从DB的某个字段中取消息的字符串并在流程中构造消息。该需要通过pipeline进行升级属性字段,验证消息等处理。BizTalk架构已经开放了此接口: XLANGPipelineManage类,以下为在流程中使用接收和发送端口示例。需在项目中引用Microsoft.XLANGs.Pipeline组件(C:Program FilesMicrosoft BizTalk Server 2006Microsoft.XLANGs.Pipeline.dll)
1.使用接收管道
在XLANGPipelineManage类中调用ExecuteReceivePipeline()执行接收管道。
XLangPipelineMangae类中的方法代码:
publicstaticReceivePipelineOutputMessagesExecuteReceivePipeline(TypereceivePipelineType,XLANGMessageinMsg);
在流程中新建一个变量 vRecOut 类型为:ReceivePipelineOutputMessages
新建一个消息 SchMsg 类型为定义的Schema
在构造消息表达式的值为:
vRecOut=Microsoft.XLANGs.Pipeline.XLANGPipelineManager.
ExecuteReceivePipeline(typeof(TestPipelines.MyRecPipeline),InputMsg);
SchMsg=null;//初始化输出消息。
vRecOut.MoveNext();//IElement的默认方法。
vRecOut.GetCurrent(SchMsg);
TestPipelines.MyRecPipeline 为管道的Fully Qualified Name(完全限定名称),包括命名空间和类名。
InputMsg 为输入的消息,也就是要传到管道处理的消息。
2.使用发送管道
调用ExecuteSendPipeline()执行发送管道。
XLangPipelineMangae类中的方法代码:
publicstaticvoidExecuteSendPipeline(TypesendPipelineType,SendPipelineInputMessagesinMessages,XLANGMessageoutXLANGMsg);
在流程中新建一个变量 vInMsgs 类型为SendPipelineInputMessages
新建一个消息 SendMsg 类型为Send Pipeline处理之后的消息。
在构造消息的表达式的值为:
vInMsgs.Add(InputMsg);
SendMsg=null;
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(TestPipelines.MySendPipeline),vInMsgs,SendMsg);
TestPipelines.MySendPipeline为管道的Fully Qualified Name(完全限定名称),包括命名空间和类名。
InputMsg 为输入的消息,也就是要传到管道处理的消息
注意:构造消息需要在构造形状里执行,并且在构造形状的属性里选择要构造的消息否则会报如下错误
Illegal attempt to update the value of part 'part' in XLANG/s message 'InputMsg' after the message construction was complete
作者: ttggl 时间: 2009-5-25 12:36
BizTalk开发系列(十二) Schema设计之Group与Order。
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档。因此消息的格式为XML Schema(XML Schema用于描述 XML 文档的结构)。虽然BizTalk提供了对于XML消息的验证功能。但是往往在BizTalkSchema设计器设计Schema的时候对于Group的用途不是很在意。今天我们来了解一下它的作用,希望对于设计灵活的Schema有点帮助。
首先,我们来了解一下Group的概念,在W3C的定义中. Group是用于定义在复杂类型定义中使用的元素组。BizTalk定义的Schema当然也是符合W3C规范的.但是Group概念跟W3C规定的稍微有点区别的:除了AttriubteGroup(元素组)之外通过BizTalk Schema设计的Group不会真正创建组,即在Schema文件中不会出现GroupName。而是通过相应的Order指示器定义一个复杂类型。我们以下讲的Group都是通过BizTalk Schema设计器定义的Group.
从Schema设计器中可以得到以下几种类型的Group:
1. Sequence 规定子元素必须按照特定的顺序出现
2. Choice 指示器规定可出现某个子元素或者可出现另外一个子元素(可理解为单选)
3. All 子元素能够以任意顺序出现,每个子元素可出现零次或一次。
4. Attriubte 属性组
Group 示例
打开VisualStudio创建一个BizTalk项目并且新建一个Schema文件。在Schema文件上右击属性在输入输出属性中输入同一个文件的路径。在接下来的测试中可以直接通过右击Schema选择生成实例和验证实例这两项目来测试效果。
Sequence Group
作者: ttggl 时间: 2009-5-25 12:37
在Root节点中新建一个Record(记录)节点,名为SequenceRecord。在该节点新建Sequence Group. 在Group下创建三个Element(元素)。如下图所示
生成Schema的XML实例,打开源码可得到如下的XML内容。
<ns0:Root xmlns:ns0="http://schemasample.schema1"/>
<SequenceRecord>
<First>First_0</First>
<Second>Second_0</Second>
<Third>Third_0</Third>
</SequenceRecord>
</ns0:Root>
验证Schema实例可以输出窗口看到成功通过验证的消息。这时更改节点的位置.将Third节点移到First节点之前,保存文件。再次验证Schema实例。可以在输出窗口看到如下消息:
E
rojectsSchemaSampleMsgsSchema1.xml: error BEC2004: The element'SequenceRecord' has invalid child element 'Third'. List of possibleelements expected: 'First'.
Choice Group
在Root节点中新建一个Record(记录)节点,名为ChoiceRecord。在该节点下新建Choice Group. 在Group下创建两个Element(元素)。如下图所示
生成Schema的XML实例.打开源码可得到如下XML内容(节选)
<ChoiceRecord>
<Female>Female_0</Female>
作者: ttggl 时间: 2009-5-25 12:37
</ChoiceRecord>
验证Schema实例可以输出窗口看到成功通过验证的消息。这时在ChoiceRecord节点下添加如下内容:
<Male>Male_0</Male>
保存文件,再次验证Schema实例。在输出窗口得到如下内容:
E:ProjectsSchemaSampleMsgsSchema1.xml: error BEC2004: The element 'ChoiceRecord' has invalid child element 'Male'.
这时可去掉Female节点,再次验证。在输出窗口亦可看到验证成功的消息。
Attriubte Group
在Root节点中新建一个Record(记录)节点,名为AttributeGroup。在该节点下新建Attribute Group. 在Group下创建两个Attribute(属性)。如下图所示 
设计器只允许在Attribute Group下面创建Attribute字段。
生成Schema的XML实例可得到如下内容(节选)
<AttributeRecord Attribute_1="Attribute_1_0" Attribute_2="Attribute_2_1"/>
总结
通过以上的Sample了解了BizTalkGroup的类别及作用。Sequence,Choice,All类型是W3C中定义的Order指示器(Order指示器用于定义元素的顺序),但不知为何ALl Group一直是灰色的。所以本实例就没有对All类型进行测试。另外还可能通过直接定义Record的Group Order Type属性直接指定整个记录的排序类别(如下图所示)。
作者: ttggl 时间: 2009-5-25 12:39
BizTalk开发系列(十三) Schema设计之值约束。
XML Schema 的作用是定义 XML 文档的合法构建模块。在开发过程中有时需要对XML文档做精确的约束。以保证XMl数据的准确性。
今天我们以一个班级Sample来讲探讨一下如何在开发BizTalk Schema过程中对XML数据做精确的约束。这个Schema定义了一个班级,班级下面有成员,成员下面有Name属性,Mobile,City,Result,Comment等字段。
依据以上场景我们对不同的属性或无素做如下需求分析:
| 字段 | 类型 | 作用 | 基类 | 约束 |
| Name | 属性 | 名称 | string | 2-4个字符 |
| Mobile | 元素 | 手机号 | string | 11个数字字符 |
| City | 元素 | 城市 | string | 列表:Beijing, Chengdu, Shenzhen |
| Result | 元素 | 成绩 | int | 数字列表,以空格隔开各成绩值。 |
| Comment | 元素 | 评论 | int/string | 数字或字符串型 |
1. Default 不从任何类型中派生。
2. Restriction 从简单类型中派生出新的受限制的数据类型
3. List 单个简单类型的**(可理解为数组)
4. Union 多个简单类型的**
看了以上的概念大概了解一下这几种设置的区别,现面我们来看一下为相应的字段设置属性值。首先我们打开Name属性字段的属性窗口。如下图所示。在Advanced类别的DerivedBy值下拉框里有四个选项。由于Name属性字段的约束为2-4个字符。因此设置值为Restriction(限制).并在Restriction(限制)类别中分别设置Maximum Length和Minimum Length的值为4和2。
由于Mobile为数字型的字符串而且有长度的限制。如果单单像Name属性那样设置不能达到约束目的。W3C的Schema规范中提供了模式约束(pattern constraint)。在Mobile字段的属性窗口设置Derived By属性值为 Restriction在Restriction(限制)类别下的Pattern属性则是可以输入约束语句(支持正则表达式)。我们可以在打开的编辑窗口中输入:[0-9]{11} 正则表达式语句限制字符串由11个0-9数字组成。
City的值是要由列表限制的。Schema规范也提供了枚举约束(enumerationconstraint)模式。在City字段的属性窗口设置Derived By属性值为Restriction。在Restriction(限制)类别下的Enumeration属性编辑窗口输入如下图所示的值。
Result其实是一个数值类型的数组。如下图所示设置Derived By属性值为List。设置Item Type值为xs:int。
Comment 评论字段由于不确定得到的值是字符串类型的还是数值类型的(有可能得到一段评语也有可能得到一个分值)。因此是一个复合型的字段。
通过以上的设置已经完成了Schema的定义过程。会在Schema Soruce窗口得到如下代码:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemasample.limit%22/%5C%22]http://schemasample.limit"/[/url] targetNamespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemasample.limit%22/%5C%22]http://schemasample.limit"/[/url] xmlns:xs="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/2001/XMLSchema%5C%22]http://www.w3.org/2001/XMLSchema[/url]">
<xs:element name="Class">
<xs:complexType>
<xs:sequence>
<xs:element name="Member">
<xs:complexType>
<xs:sequence>
<xs:element name="Mobile">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="11" />
<xs:pattern value="[0-9]{11}" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="City">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Beijng" />
<xs:enumeration value="Chengdu" />
<xs:enumeration value="Shenzhen" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Result">
<xs:simpleType>
<xs:list itemType="xs:int" />
</xs:simpleType>
</xs:element>
<xs:element name="Comment">
<xs:simpleType>
<xs:union memberTypes="xs:int xs:string" />
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="4" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
作者: ttggl 时间: 2009-5-25 12:39
测试
测试Scheam可能在Shema文件的属性中直接设置同一个输出与输入文件路径方便测试。有一点需要注意的是设置了相关约束之后通过Schema的生成实例选项生成出来的XML文件并不一定是符合约束条件的,特别是对于模式约束(pattern constraint。这一点在BizTalk的帮助文件里已经提到了这是一个已经的问题。
但不管怎么样直接生成实例是最简单的方式。通过直接生成实例我们得到了以下的XML数据:
<ns0:Class xmlns:ns0="http://schemasample.limit"/>
<Member Name="Nam">
<Mobile>MobileMobil</Mobile>
<City>Beijng</City>
<Result>10</Result>
<Comment>10</Comment>
</Member>
</ns0:Class>
直接验证实例不能成功。提示Mobile不符合规范。我们修改XML数据如下:
<ns0:Class xmlns:ns0="http://schemasample.limit"/>
<Member Name="Nam">
<Mobile>13800138000</Mobile>
<City>Beijng</City>
<Result>90 95 97 99</Result>
<Comment>Good!</Comment>
</Member>
</ns0:Class>
再次验证实例可以通过验证。虽然通过了测试不过请对比上下两个XML数据,以理解不同模式的区别。红色加粗部分为整数型的成绩字段数组。在Schema 声明的时候使用List模式。该模式是使用空格分隔不同值,因些需注意在List模式下使用string类型的时候要注意内容是否有空格。
粉色加粗部分是复合类型。上一个XML数据使用了整合类型通过验证。下一个使用字符串类型也同样通过验证。
作者: ttggl 时间: 2009-5-25 12:52
BizTalk开发系列(十四) XML空白字符(WhiteSpace)。
最近在做一个BizTalk项目,对XML文件的处理很复杂。本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格。但是找了很久没有看到相关的方法。如果有知道该方法的麻烦跟我讲一下:cbcye@live.com不过下面我整理了一下与之相关的XML空白字符(WhiteSpace)。
先来看看这个问题比较一下这两个XML是否一样?
XML(一)
<AddBook>
<Name/>
<Mobile/>
</AddBook>
XML(二)
<AddBook><Name/><Mobile/></AddBook>
如果你觉得一样的话,那么我们来进行如下。我们使用的是XSLT(XML转换语言)读取整个XML文档。此XSLT文件的作用是拷贝整个源XML文档中的节点到目标XML文件中。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/1999/XSL/Transform%5C%22]http://www.w3.org/1999/XSL/Transform[/url]">
<xsl
utput method="xml" indent="yes"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet> 测试时在Visual Studio的XSLT调试界面设置断点。在监视窗口使用Xpath函数:node()来查看XML文档中的节点变化情况。
XML(一)的节点:
XML(二)的节点:
从以上的测试数据可以看出当XML处于不同行的时候XML会多一些类型为whitespace的节点。由此可见XML(一)与XML(二)是不相同的。那为什么它们之间不相同呢?那为什么我们使用IE之类的XML解析器打开两个文件的话看到的效果是一样的?当然我们这里不讨论IE之类的是如何处理的(事实上是我也不知道IE是如何处理的:)。我们主要来看看这两个XML之间为什么不一样。也就是本文要涉及的Whitespace。
首先我们来了解一下在XML里什么叫WiteSpace。XML 将以下四种字符归为空白字符:回车符(r 或 ch(13))、换行符(n 或 ch(10))、制表符 (t) 以及空格 (' ')。在 XML 文档中,空白字符分为两类:
有意义空白字符 是文档内容的一部分,应予以保留。
无意义空白字符 在编辑 XML 文档时使用,以增加可读性。这些空白字符一般在文档交付时不予保留。
由此可见XML文档有时根据处理需要会增加一些回车、换行之类的特殊字符。但是如果这些字符在处理XML时不先清除(如果有必要的话)。那么就会造成一些错误。比如在XSLT文件中有如下表达式的话那么XML文件中的空白字符就有可能引用转换处理错误。因为空白字符是不能作为节点名称的。
<xsl:elementname="{local-name()}">
了解了XML文件中有无空白字符的区别与XML文件中空白字符的用处之后我们来了解一下XML处理器是如果处理空白字符的。该如何根据需要处理空白字符。
XML 分析:XML 规范提供了一个内置属性 xml:space 来告知 XML分析器其是否应忽略空白字符。该属性由其根元素的子元素来继承。声明时,必须将其指定为枚举类型,其可能的值只能是“default”和“preserve”。如果指定为“preserve”,则所定义元素内的空白字符必须保留。
示例:
XML数据
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://quicklearn.cn"/>
<part1>
<ns0:books xmlns:ns0="http://books.quicklearn.cn"/>
<ns0:book>
<name>BizTalk Develop</name>
<ISDN>0101010101010</ISDN>
</ns0:book>
</ns0:books>
</part1>
<part2>
<ns1:customers xmlns:ns1="customers.quicklearn.cn">
<customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer>
</ns1:customers>
</part2>
</root>
C#代码
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(@"D
rojectsTempXSLTTestXSLTTestXSLTTestXMLData2.xml");
this.richTextBox1.Text = xmlDoc.OuterXml;
输出效果
<?xml version="1.0" encoding="utf-8"?><root xmlns="http://quicklearn.cn"/><part1><ns0:books xmlns:ns0="http://books.quicklearn.cn"/><ns0:book><name>BizTalk Develop</name><ISDN>0101010101010</ISDN></ns0:book></ns0:books></part1><part2><ns1:customers xmlns:ns1="customers.quicklearn.cn"><customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer></ns1:customers></part2></root>
BizTalk开发系列(十四) XML空白字符(WhiteSpace)
BizTalk开发系列(十四) XML空白字符(WhiteSpace)
XSLT 转换。W3C XSLT 规范提供了两个元素(即 xsl:strip-space 和 xsl:preserve-spacea
示例: XML数据
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://quicklearn.cn%22/%5C%22]http://quicklearn.cn"/[/url]>
<part1>
<ns0:books xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://books.quicklearn.cn%22/%5C%22]http://books.quicklearn.cn"/[/url]>
<ns0:book>
<name>BizTalk Develop</name>
<ISDN>0101010101010</ISDN>
</ns0:book>
</ns0:books>
</part1>
<part2>
<ns1:customers xmlns:ns1="customers.quicklearn.cn">
<customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer>
</ns1:customers>
</part2>
</root>
C#代码
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(@"D
rojectsTempXSLTTestXSLTTestXSLTTestXMLData2.xml");
this.richTextBox1.Text = xmlDoc.OuterXml;
输出效果
<?xml version="1.0" encoding="utf-8"?><root xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://quicklearn.cn%22/%3E%3Cpart1%3E%3Cns0:books%5C%22]http://quicklearn.cn"/><part1><ns0:books[/url] xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://books.quicklearn.cn%22/%3E%3Cns0:book%3E%3Cname%3EBizTalk%5C%22]http://books.quicklearn.cn"/><ns0:book><name>BizTalk[/url]Develop</name><ISDN>0101010101010</ISDN></ns0:book></ns0:books></part1><part2><ns1:customersxmlns:ns1="customers.quicklearn.cn"><customerxml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer></ns1:customers></part2></root>

XSLT转换。W3C XSLT 规范提供了两个元素(即 xsl:strip-space 和xsl:preserve-spacea
BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified。
XMLSchema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如“<ns0:root>...</ns0:root>”之类的格式。一般情况下在BizTalkSchema编辑器中设置架构的属性
elementFormDefault /AttributeFormDefault
在该 schema 的目标命名空间中声明的元素的形式。该值必须是下列字符串之一: "qualified" 或 "unqualified"。 默认值为 "unqualified"。
"unqualified" 指示无须通过命名空间前缀限定目标命名空间的元素/属性。
"qualified" 指示必须通过命名空间前缀限定目标命名空间的元素属性。
另外可以直接在记录、元素、属性的属性窗口设置Form的值.
Form
如果该值是 “unqualified”,则无须通过命名空间前缀限定该元素。
如果该值是 “qualified”,则必须通过命名空间前缀限定该元素。
Schema中对于声明是可以继承的,但也是可以重写声明的。即如果在架构中声明了ElementFormDefault属性(全局声明)而子元素没有声明Form(局部声明)的话则该元素则继承ElemnetFormDefault属性。如果子元素重新声明了Form属性则该声明在该元素上优先于全局的声明。
通过以上的设置通常就可以实现对架构,元素或属性的命名空间前缀限定。但在有些情况下虽然设置了ElementFromDefault(Attribute一般为属性部声明)的值为UnQualified。但是使用生成实例生成的XML元素或记录还是会带命名空间前缀(如下XML),这种情况一般发生在使用Schema生成向导生成的Schema,从XDR(BizTalk2002以前使用的Schema格式)转到XSD(BizTalk 2004以后使用的Schema 格式)。
<ns0:Root DATE="DATE_0" xmlns:ns0="http://schemasample.test">
<ns0:Record>
<ns0:SubRecord NUM="NUM_0">
<ns0:TestField>TestField_0</ns0:TestField>
</ns0:SubRecord>
</ns0:Record>
</ns0:Root>
经过测试发现Schema的设置不能应用到子记录或元素的原因是记录的类型为引用类型,并且引用了全局的元素。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://orchtest.schema1/" elementFormDefault="unqualified" targetNamespace="http://orchtest.schema1/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<b:schemaInfo standard="XML" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" root_reference="Root" displayroot_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Record1">
<xs:complexType />
</xs:element>
<xs:element name="Field1" type="xs:string" />
<xs:element name="Field2" type="xs:string" />
<xs:element name="Record2" type="Record2" />
<xs:element minOccurs="1" maxOccurs="1" ref="ExtRecord" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ExtRecord">
<xs:complexType>
<xs:choice minOccurs="0">
<xs:element name="TestField">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
<xs:attribute name="NUM" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:complexType name="Record2">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:attribute name="Field" type="xs:string" />
</xs:complexType>
请注意上图的几个背景部分: 绿色部分 为在架构中声明全局属性即元素不需要命名空间前缀限定
灰色部分 为在Schema编辑器中自定义的Complex Type.
黄色部分 为转换向导生成的类型
粉色部分 为在Root节点引用ExtRecord元素的类型。
特别注意红色部分,如果没有加上红色部分的声明的话在BizTalk编辑器会显示所有元素。即会出现两个ExtRecord节点。
使用Schema生成实例生成的XML数据如下:
<ns0:Root xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://OrchTest.Schema1[/url]">
<Record1 />
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
<Record2 Field="Field_0" />
<ns0:ExtRecord NUM="NUM_0">
<TestField>TestField_0</TestField>
</ns0:ExtRecord>
</ns0:Root>
我们再来改变一下Schema(注意,此修改是在XML编辑器进行,而不是在BizTalk的Schema编辑器。右击Schema文件,选择打开方式,在对话框中选择XML编辑器)
更改之后的XML如下:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://orchtest.schema1/[/url]" elementFormDefault="unqualified" targetNamespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://orchtest.schema1/[/url]" xmlns:xs="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/2001/XMLSchema%5C%22]http://www.w3.org/2001/XMLSchema[/url]">
<xs:annotation>
<xs:appinfo>
<b:schemaInfo standard="XML" xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" root_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Record1">
<xs:complexType />
</xs:element>
<xs:element name="Field1" type="xs:string" />
<xs:element name="Field2" type="xs:string" />
<xs:element name="Record2" type="Record2" />
<xs:element name="ExtRecord">
<xs:complexType>
<xs:choice minOccurs="0">
<xs:element name="TestField">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
<xs:attribute name="NUM" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Record2">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" />
</xs:appinfo>
</xs:annotation>
<xs:attribute name="Field" type="xs:string" />
</xs:complexType>
</xs:schema>
保存Schema。生成实例如下:
<ns0:Root xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://OrchTest.Schema1[/url]">
<Record1 />
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
<Record2 Field="Field_0" />
<ExtRecord NUM="NUM_0">
<TestField>TestField_0</TestField>
</ExtRecord>
</ns0:Root>
经查证。XML Schema中的全局声明必须是唯一的,而全局模式中的每一个声明都自动进入目标名称空间。因此ElementFormDefault的设置不能作用于该元素。
BizTalk开发系列(十六) XML命名空间。
BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操作。则有机会遇到XML命名空间的问题。常见的是使用Xpath选取节点的时候不知道要不要加上命名空间前缀,或者是什么时候该加什么时候不该加。为此,做一个Sample来校验一下XML命名空间在XML操作过程中的影响。
名称空间是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属性,避免了名称之间的**。XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
Sample说明
新建一个测试XML。内容如[Code1]设置不同的命名空间使用场景。另外新建一个XSLT(XML转换语言)文件,内容如[Code2]。在 Visual Studio中使用XSLT测试中的断点在监视窗口通过Xpath查询。校验在什么情况下哪些节点需要命名空间。
[Code1]
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0="http://quicklearn.cn" xmlns:ns1="http://addressbook.quicklearn.cn" xmlns:ns2="http://person.quicklearn.cn">
<ns1:addressbook id="1" >
<ns2:person>
<name>cbcye</name>
<mobile>12345</mobile>
</ns2:person>
</ns1:addressbook>
</Root>
[Code2]
<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="[url=http://tech.ddvip.com/2008-10/%22http://www.w3.org/1999/XSL/Transform/%22]http://www.w3.org/1999/XSL/Transform[/url]"
version="1.0"
xmlns:qn="[url=http://tech.ddvip.com/2008-10/%22http://quicklearn.cn%22//%22]http://quicklearn.cn"/[/url]
xmlns:adr="[url=http://tech.ddvip.com/2008-10/%22http://addressbook.quicklearn.cn%22//%22]http://addressbook.quicklearn.cn"/[/url]
xmlns:per="[url=http://tech.ddvip.com/2008-10/%22http://person.quicklearn.cn%22//%22]http://person.quicklearn.cn"/[/url]
>
<xsl:template match="/">
<xsl:apply-templates select="/"/>
</xsl:template>
</xsl:stylesheet>
[测试贴图]
缺省命名空间
缺省命名空间适用于声明它的元素(如果那个元素没有命名空间前缀)和所有该元素内容中所有没有前缀的元素。假如在缺省命名空间声明里的 URI 引用为空,那么在声明范围内没有前缀的元素不被认为存在任何命名空间里。注意缺省命名空间不直接适用于属性。
Test1 无命名空间
<?xml version="1.0" encoding="utf-8"?>
<Root>
<addressbook id="1">
…
</addressbook>
</Root>
元素:addressbook Xpath表达式: /Root/addressbook 属性:id Xpath表达式: /Root/addressbook /@id
Test2 有命名空间
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns=http://quicklearn.cn/>
<addressbook id="1">
…
</addressbook>
</Root>
元素:addressbook Xpath表达式: /qn:Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/qn:addressbook/@id (qn为在XSLT文件中声明的前缀)
命名空间前缀
命名空间前缀提供合法名字的命名空间前缀部分,并且必须与在命名空间声明中的一个命名空间 URI 引用相关联。注意前缀只起命名空间占位符的作用。应用程序应使用命名空间名,而不是前缀,来构成有效范围在所含文档之外的名字。
Test1 前缀+根节点
<?xml version="1.0" encoding="utf-8"?>
<ns0:Root xmlns:ns0=http://quicklearn.cn/>
<addressbook id="1">
…
</addressbook>
</ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/addressbook /@id (qn为在XSLT文件中声明的前缀)
Test2 前缀+ 子元素
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0=http://quicklearn.cn/>
<ns0:addressbook id="1">
…
</ns0:addressbook>
</Root>
元素:addressbook Xpath表达式: /Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/qn:addressbook /@id (qn为在XSLT文件中声明的前缀)
多个命名空间
在一个XML文档中存在多个命名空间,命名空间通过缺省或都前缀约束元素或属性存在于中个命名空间。
Test1
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns=http://quicklearn.cn/>
<addressbook id="1" xmlns=http://addressbook.quicklearn.cn/>
…
</addressbook>
</ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/adr:addressbook (qn,adr为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/adr:addressbook /@id(qn,adr为在XSLT文件中声明的前缀)
Test2
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0="http://quicklearn.cn"/ xmlns:ns1="http://addressbook.quicklearn.cn"/ xmlns:ns2="http://person.quicklearn.cn"/>
<ns1:addressbook id="1" >
<ns2:person>
<name>cbcye</name>
<mobile>12345</mobile>
</ns2:person>
</ns1:addressbook>
</Root>
BizTalk开发系列(十六) XML命名空间。


元素:name Xpath表达式: /Root/adr:addressbook/per:person/name
(qn,adr,per为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/adr:addressbook/@id (qn,adr为在XSLT文件中声明的前缀)
总结
XML命名空间使用规则大概可以归纳如下:缺省命名空间约束全局,带前缀命名空间约束局部,局部声明优先全局。另外如果你能坚持看到这里的话顺便回答一下这个问题:以下XML文档中Test节点有无命名空间?如果有的话命名空间是什么?
<ns0:Root xmlns:ns0="http://quicklearn.cn"><Test></Test></ns0:Root>
[Update: 2008.10.21 11:40]
如果您有安装XML Spy的话。则可以直接使用XML Spy的Xpath求值功能(在菜单栏中点击XML选择求Xpath值)。直接使用Xpath表达式求得各节点或属性的Namespace。

Xpth表达式
//concat(local-name()," >>> ",namespace-uri()) 所有节点,包括空白字符
//@*/concat(local-name()," >>> ",namespace-uri()) 所有属性节点
//*/concat(local-name()," >>> ",namespace-uri()) 所有节点,不包括空白字符
BizTalk开发系列(十七) 信封架构(Envelop)。
在BizTalk开过中使用信封架构可以提高BizTalk处理性能。比如在使用SQLAdapter时使用信封选取多条记录在通过管道的XML拆装器时将信封里的XML消息部分拆分为单独的消息,发布到MessageBox。BizTalk会创建多个处理实例处理这些消息。减少SQL Adapter与数据库的交互次数。
什么是信封架构?
微软官方对信封架构是这样定义的:信封架构是一种特殊类型的 XML 架构。(不是W3C定义的)信封架构用于定义 XML信封的结构,以用于将一个或多个 XML 业务文档包装到单个 XML 实例消息中。在将 XML架构定义为信封架构时,根据是否在信封架构中定义了多个根记录,可能需要其他一些属性设置。
如何创建信封架构?
大部分情况下信封架构是一个比较简单的XML架构。因为在XML拆装过程中信封部分的内容是要被删除的。当然除了信封的升级属性和可分辨字段会升级到消息的上下文中被信封里的消息个体所继承。在BizTalkSchema编译器中创建信封架构前几步跟创建普通架构是一样的,只不过需要设置一下相关的属性。具体是这样的:
创建一个Schema。点击<Schema>在属性设置中设置Envelop属性为Yes。在信封根(Root)中设置“正文Xpath”。如果架构中存在多个根且没有设置根引用则需要为每个根设置”正文 Xpath”。如果架构在存在多个根且设置了根引用则为根设置“正文Xpath”。其他根则可选。
一般情况下,在“正文Xpath”设置的对话框中选择相应的节点则可以自动生成相应的Xpath表达式。如果自动生成功能无法满足用户需求的情况下,用户可以手动输入Xpath表达式。
信封的拆装
信封的拆装发生在接收管道的的拆装阶段通过使用XML拆装器完成的。XML 拆装器管道组件将 XML 解析功能和拆装功能组合到一个组件中。该组件的主要功能如下:
删除信封。
根据预定义的Xpath对消息正文进行拆装。
将信封部分的可分辨字段和属性升级到消息上下文。
收到消息之后,拆装器通过使用在设计时指定的与该组件关联的架构来静态地解析,或通过在运行时根据消息类型(Namespace#RootName)确定信封架构来动态地解析。架构用于在信封解析过程中对消息的结构进行验证。如果未定义架构构,则可通过使用根节点的命名空间和基名称查找架构,从而以递归方式确定消息架构。
如果有且只有一个架构与消息匹配,则拆装器读取架构的批注内容,如下所示。(可能实际过程中会读取更多信息)
<xs:appinfo> <b:schemaInfo is_envelope="yes" xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" /> 架构批注指明此消息为信封架构。拆装器通过使用预定义的 XPath(编码为与信封和消息相关联的 XSD架构中的批注)从信封和消息实例中提取内容属性。该组件将对信封内的每个文档进行解析。对于每个文档,BizTalk消息对象都使用其本身的上下文创建,从信封和文档本身升级的所有属性均是从此上下文中复制而来。
<xs:element name="Root">
<xs:annotation>
<xs:appinfo>
<b:recordInfobody_xpath="/*[local-name()='Root' andnamespace-uri()='http://SchemasAPP.EnvelopSchema']/*[local-name()='EnvelopBody'and namespace-uri()='']" />
拆装器的“RecoverableInterchangeProcessing”属性表示:如果值为True则信封中的所有消息都能找到唯一的消息架构时该信封中的所有正文消息才会处理,否则挂起所有消息。如果值为False则只有找不到消息架构的消息会被挂其他消息则会被处理。(此功能不只针对信封消息!)
参考资料: 《Microsoft BizTalk 2006 Help》
BizTalk开发系列(十八) 使用信封拆分数据库消息。
之前写了一篇的《BizTalk开发系列(十七)信封架构(Envelop)》是关于信封架构及其拆装原理的,都是理论性的内容。信封在BizTalk开发过程中最常用的应该是在读取SQLServer 数据库的时候。一次性读取多条消息,提高了SQL Adapter对SQLServer的读取性能。今天就来做一下这个实例,增强对信封消息的理解。
数据库采用的是SQL Server 2005示例数据库:AdventureWorks 通过select * from Production.Culture选择所有的Cluster信息。如下图所示:
创建表架构和信封架构
创建BizTalk项目之后,根据生成架构向导生成数据库中表架构。在架构信息中的目标命名空间和文档根节点中依下图分别输入相应的值。
在类型中选择SQL脚本,在脚本编辑窗口输入如下脚本(表示将表列名映射为架构中的元素):
select * from Production.Culture for xml auto,elements
架构生成向导会生成架构文件,内容如下。同时也会产生一个声明了此类型的Orchestration,可以将此Orchestration删除。
需要修改生成的Schema.将Production.Culture节点下的所有元素提升到根节点下。根节点修改为:Production.Culture。最后将子节点的Production.Culture删除。修改后的内容如下:
修改了表架构,现在需要另外创建一个信封架构。信封架构设计需要注意几点:1. 命令空间跟表架构保持一致。2.根节点必须为:EnvelopRoot。当然这两点也不一定非得都遵从。如果你已经很清楚了信封的原理则应该知道为什么要这么做和如何根据需要进行修改。
信封架构的创建比较简单。创建一个架构,目标命名空间跟表架构一致,信封属性设置为Yes。将根节点名称修改为:EnvelopRoot。在根节点的属性中修改根节点的数据构造类型设置为:xs:anyType(注:anyType为Schema中所有类型的基类,类似于C#中的System.Object)。在设置根节点BodyXpath的对话框中选择EnvelopRoot。
部署项目,创建接收端口和订阅发送端口
两个Schema创建好之后就可以部署项目了。在部署项目之前需要设置程序集密钥,应用程序名称。部署项目之后可以新建接收端口:ReceiveSQLRecords 参照下图配置SQL接收位置。注意Document Root ElemntName的值要与信封架构的根节点值一致。Document TargetNamesapce值也要与信封,表架构的目标命名空间一致。接收管道选择系统内置的:XMLRecive
新建发送端口,在发送端口的Filter选项中定义过滤规则为:BTS.ReceivePortName == ReceiveSQLRecords。
测试
启动BizTalk项目,在发送位置的文件夹会生成经过拆分的消息。由于BizTalk在读取数据之后没有对数据库的记录进行删除操作所以每次BizTalk SQL Adapter轮询的时候SQL脚本都能取到消息。以至于不断的生成消息到目标文件夹中。需要关闭端口或应用程序。
总结
通过架构拆分数据库记录是信封使用的经典案例。我们将接收管道改为
assThruReceive。可以得到从数据库生成的原始消息,如下图。当然如果你有兴趣的话可以结合:《BizTalk开发系列(十七) 信封架构(Envelop)》分析一下拆装的过程。
BizTalk开发系列(十九) BizTalk命名规范。
目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束。根据以往BizTalk项目的经验,整理了BizTalk命名规范。包括:BizTalk Application, Schema, Map, Pipeline, Orchestration Logic Port, Physical Port等。并提供了相关的示例方便大家参考。
《BizTalk命名规范》
通用:
项目中能用英文单词的用单词,否则用拼音。
BizTalk项目中的Schema , Map, Orchestration , Pipeline文件的完全合格名称默认为项目的命名空间加点号加文件的类名。如无特别说明不做相应修改。
BizTalk项目中的文件名称默认和类名称一致,如无特别说明BizTalk项目中的项目成员名称不能与C#保留字一样。例如:schema.xsd、XmlContent 和 RootNodes
1.Biztalk应用程序命名
格式:项目组名称.项目名称.应用程序名称
示例:BTSGroup.EAI.General
2.Schema命名
常规Schema/平面文件Schema
格式:Sch_业务名_ 描述
示例:Sch_PO_Src.xsd
说明:Schema的文件名称(不包括后缀)应与Schema的文件类名一致。
根节点名称不能使用.NET关键字或保留字,例如 System
信封Schema
格式:Sch_Envelop_描述
示例:Sch_Envelop_PO
命名空间
格式: http://schemas.项目名称.项目组名称/时间/业务/描述
示例: http://schemas.eai.btsgroup//2008/po/posource
说明: 在描述里面可以使用"-"
Schema节点、元素、属性
说明:只允许使用 字母、数字、下划线
3.Mapping命名
格式:Map_业务名称_描述
示例:Map_PO_Src2Trg.btm
说明:Map的文件名称(不包括后缀)应与Map的文件类名一致。
4.自定义PipeLine命名
格式:
接收管道 : Pip_R_描述.btp
发送管道 : Pip_S _描述.btp
示例:
接收管道: Pip_R_AddNS.btp
发送管道:Pip_S_RemoveNS.btp
说明:Pipeline的文件名称(不包括后缀)应与Pipeline的文件类名一致。
5.Orchestration命名
Orchestration文件/类型命名
格式:
主流程 :Orc_Main_ 描述.odx 如: Orc_Main_Business.odx
子流程 : Orc_Sub_ 描述.odx 如: Orc_Sub_Starter.odx
示例:
主流程 :Orc_Main_POProcess.odx
子流程 : Orc_Sub_Initialization.odx
说明:Orchestration的文件名称(不包括后缀)应与Orchestration的文件类名一致。
Message命名
格式:业务名_ 描述Msg
示例:POProcess_POMsg
Multity Message命名
格式:Multi_业务名称_描述
示例: Multi_POProcess_PO
说明:如果是单部分消息则参数取名为 "Body"
变量命名
格式:用途描述及类型
示例: tempXmlDoc
相关集与相关集类型命名
格式:
相关集类型命名 : Corn_业务名称_描述Type
相关集命名 : Corn_业务名称_描述
示例:
相关集类型: Corn_Starter_GenType
相关集: Corn_Starter_Gen
端口类型命名
格式:
逻辑接收端口类型命名 : 业务_描述 _RecType
逻辑发送端口类型命名 : 业务_描述_SendType
示例:
PO_GetDB_PType
PO_InsDB_PType
逻辑端口命名
格式:
逻辑接收端口命名 : 描述
逻辑发送端口命名 : 描述
示例:
PublishPO
物理端口命名
格式:
物理接收端口命名 : RecPort+描述
物理接收端口位置命名 : RecLocn_描述
物理发送端口命名 : SendPort _描述
物理发送端口组命名: 用途描述单词 + SendPortGroup 如: InsertDB_SendPortGroup
示例:
RecPort_POData
RecLocn_MSIDB
SndPort_MSIDB
流程形状名称命名
采用动宾名称 ,动词根据形状名称命名,判断形状和表达式形状除外。常规使用描述即可。
BizTalk开发系列(二十一) Mapping 扩展开发。
BizTalkMap编辑器提供了常用的功能块,比如数据库,字符串,数字计算等功能。可在设计Map时直接使用这些功能块进行扩展。除此之外对于进行复杂的Map处理,Map 编辑器提供了扩展XSLT,扩展XML以及脚本功能块。给Map开发提供了强大的可扩展空间。BizTalkSDK已经提供了Map扩展的Sample(C:Program FilesMicrosoft BizTalk Server2006SDKSamplesXmlToolsExtendingMapper)。以下将分别针对不同场景讲述这些扩展功能。
自定义扩展XML
如果在自定义XSLT或者在内联型的XSLT中使用外部.NET程序集。则需要使用自定义扩展XML将命名空间与程序集、类关联。自定义扩展XML内容如下:
<ExtensionObjects>
<ExtensionObject Namespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003/ScriptNS0%5C%22]http://schemas.microsoft.com/BizTalk/2003/ScriptNS0[/url]"
AssemblyName="CustomFunctions, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
ClassName="CustomFunctions.MyClass" />
</ExtensionObjects>
使用时需要在Map网格属性的Custom Extension XML对话框里设置自定义XML的路径。
自定义XSLT
如果具有已用于转换实例消息的 XSLT 代码,则可以直接使用该代码,而不用创建映射。直接在Map编辑器中创建空映射(不创建源与目标Schema的链接)并在Custom Extension XSLT对话框设置自定义XSLT路径。

使用自定义XSLT时需要注意,如果使用自定义XSLT则Map文件中的映射不会产生作用。另外如果自定义XSLT文件的内容有变的话需要重新设置一次自定义XSLT路径。否则变更的内容不会产生作用。
脚本功能块
使用“脚本”功能块可以在运行时使用自定义脚本或代码执行通常情况下不可用的函数。例如,可以通过使用“脚本”功能块并编写自己的自定义函数,在运行时调用 .NET 程序集。“脚本”functoid 支持以下语言:
C# .NET
JScript .NET
Visual Basic .NET
可扩展样式表语言转换 (XSLT)
XSLT 调用模板
BizTalk 将内联脚本保存在定义映射的可扩展样式表语言转换 (XSLT) 样式表中。因此,内联脚本可以与其他任何 XSLT 样式表脚本使用相同的命名空间。下表显示了可用的命名空间:
| 命名空间 | 说明 |
| System | 系统类。 |
| System.Collection | **类。 |
| System.Text | 文本类。 |
| System.Text.RegularExpressions | 正则表达式类。 |
| System.Xml | 核心 XML 类。 |
| System.Xml.Xsl | XSLT 类。 |
| System.Xml.Xpath | XPath 类。 |
| Microsoft.VisualBasic | Visual Basic 脚本类。 |
1. 使用内联型C#脚本
编辑内联型C#脚本,只在要Configure Functoid Script对话框选择脚本类型为内联C#. 在内联脚本缓冲区输入代码即可。下图是使用内联代码执行字符串组合。
除对于一次性脚本很方便之外,内联脚本对于声明在多个脚本中使用的全局变量也很有用。例如,在 C# 内联脚本中,可以将以下代码行放在任何类之外:
System.Collection.ArrayListstatusList=newSystem.Collection.ArrayList();
该代码将创建一个 ArrayList(即 statusList),可能在所有内联型脚本中访问对此对话。比如可以在XSLT表达式里直接从ArrayList对像中存取值。
2.使用内联型XSLT
XSL(EXtensible Stylesheet Language)可扩展样式表语言,将XML中的数据用指定的显示格式输出.XSL 包含两个部分:
XSLT 用于转换 XML 文档的语言. XSLT 是指 XSL 转换 (XSL Transformations (XSLT) Version 2.0)
XPath 用于在 XML 文档中导航的语言(XML Path Language (XPath) 2.0)
以下码表示复制当前节点的Field1属性值到目标Record节点下的Field1属性。
<xsl:element name="Record">
<xsl:attribute name="Field1">
<xsl:value-of select="@Field1" />
</xsl:attribute>
</xsl:element>
3.使用内联型XSLT模板
XSLT模板当指定的节点被匹配时所应用的规则。通过在内联XSLT模板输入代码。Map使用xsl:call-template函数调用
新建的MyXsltConcatTemplate
<xsl:template match="/s0:Root">
<ns0:Root>
<xsl:call-template name="MyXsltConcatTemplate">
<xsl:with-param name="param1" select="string(Field1/text())" />
<xsl:with-param name="param2" select="string(Field2/text())" />
</xsl:call-template>
</ns0:Root>
</xsl:template>
<xsl:template name="MyXsltConcatTemplate">
<xsl:param name="param1" />
<xsl:param name="param2" />
<xsl:element name="Field1">
<xsl:value-of select="$param1" />
</xsl:element>
</xsl:template>
4.使用外部.NET 程序集
Map支持直接使用外部.NET程序集(该程序集必须安装在GAC)。如果外部程序发生了改变,需要重新启动Visual Studio。
使用外部程序集编写脚本是在 BizTalk中使用脚本的首选方式。外部程序集具有以下优点:
便于代码共享
维护更简单
调试更方便
若要重新使用脚本,只需要设置“脚本”functoid 的“脚本”属性即可。由于脚本储存在映射之外,因此可以在不更改映射的情况下修改脚本。
5.在XSLT中调用外部.NET程序集
在XSLT中调用外部.NET程序集需要使用自自定义扩展XML,将命名空间跟程序集关联。以下脚本表示在XSLT
表达式中调用外部.NET程序集的StringConcatenet方法。
缓冲区输入的XSLT脚本
<xsl:template name="ConcatenateXSLTTemplate">
<xsl:param name="param1" />
<xsl:param name="param2" />
<xsl:element name="Record">
<xsl:variable name="var:v1" xmlns:Functions="[url=http://tech.ddvip.com/2008-10/%5C%22 http://functions.mappinghelper%22/%5C%22]http://functions.mappinghelper"/[/url]
select="Functions:StringConcatenate($param1, $param2)" />
<xsl:attribute name="Field1">
<xsl:value-of select="$var:v1" />
</xsl:attribute>
</xsl:element>
自定义扩展XML代码内容:
<ExtensionObjects>
<ExtensionObject Namespace="[url=http://tech.ddvip.com/2008-10/%5C%22 http://functions.mappinghelper%22/%5C%22]http://functions.mappinghelper"/[/url]AssemblyName="MappingHelper, Version=1.0.0.0, Culture=neutral,PublicKeyToken=f41f519fda5ae4ca"ClassName="MappingHelper.Functions"/>
</ExtensionObjects>
总结
通过介绍基本涵盖了所有的Map开发方法(自定义Functoid的开发另外介绍),在Map开发过程中根据需要综合使用多种方法。有一个奇怪的问题是不要在一个Script里使用多种类型的脚本。比如要所Inline C#和InlineXSLT的代码放置不两个不同的Script功能块里,否则有可能出现跟预想不同的情况。另外注意:应避免多次使用同一个方法签名。如果多个“脚本”functoid 具有相同的方法签名,则 BizTalk 会选择实现的第一个方法签名,而忽略其他签名。
BizTalk开发系列(二十二) 开发自定义Map Functoid。
尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况。《BizTalk开发系列 Map扩展开发》介绍了通过使用自定义XSLT,脚本 Functoid等方法来扩展。这里要介绍的是通过自定义 functoid 的方法扩展。
每个自定义Functoid为从Microsoft.BizTalk.BaseFunctoids派生的类的 .NET程序集。一个程序集可包含多个自定义 functoid。下图的FormatDate功能块是自定义开发的Functoid,功能是将输入参数1的字符串按参数2的格式输出。部署之后添加到工具箱。
微软提供了相关使用自定义Functoid的场景:
您对使用只能通过专用旧式 API 访问的数据的字符代码字段应用特殊的验证和转换规则。
您需要使用自定义业务逻辑和密钥管理来加密或解密字段。
您需要从部分消息生成哈希代码以用于其他应用程序。
财务要求传输到他们部门的消息包含有关每种产品类型销售总额的摘要信息。
您希望通过合并一些相关步骤、使用其他方法或使用新的类库来降低映射的复杂性。
多个映射在脚本 functoid 中使用相同的脚本代码。
您需要将操作失败写入事件日志。
开发自定义Functoid有以下几个类别:
自定义引用 Functoid
自定义引用的 Functoid 不会将内联的实现代码复制到映射中。实际上,它将对程序集、类和方法的引用放置在与生成的样式表相关联的扩展对象文件中,并在运行时对其进行调用。
自定义内联 Functoid
自定义内联 functoid 通过将实现代码直接复制到映射中提供功能,而不像自定义引用的 functoid 通过引用程序集、类和方法名称来提供功能。
自定义累计 Functoid
自定义累计 functoid 可以对在一个实例消息中多次出现的值执行累计操作。
使用内联代码可直接将自定义 functoid 集成到解决方案中,也可以通过引用部署在全局程序集缓存中的类库的方法来间接集成。这两种类型的集成都依赖于 BizTalk.BaseFunctoid 类并遵循同样一组通用步骤:
使用您选择的 .NET 语言创建新的类库项目。
使用强名称实用程序 sn.exe 创建密钥文件并将其指定给项目。
添加对 Microsoft.BizTalk.BaseFunctoids.dll 的引用。此程序集包含 BaseFunctoid 基类。
创建资源文件并将其添加到项目中。为 functoid 名称、工具提示和说明添加字符串资源。添加一个 16x16 像素的图像资源,在映射设计器面板上代表该 functoid。
实现 functoid 类,方法是从 BaseFunctoid 派生该类,在构造函数中建立基本参数,然后编写 functoid 方法和所有支持方法。该程序集可包含多个自定义 functoid。
部署该程序集并确保可从工具箱面板访问新 functoid。
Format Date Functoid代码
using System;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Globalization;
namespace Quicklearn.CN.BTS.CustomerFunctoids
{
public class FormatDate : BaseFunctoid
{
public FormatDate()
: base()
{
//Functoid的ID号.尚未用过的大于6000的值.
this.ID = 88888;
//资源文件
SetupResourceAssembly("Quicklearn.CN.BTS.CustomerFunctoids.Resource", Assembly.GetExecutingAssembly());
//Functoid的名称,描述,说明,图像
SetName("QUICKLEARN_CN_FORMATDATE_NAME");
SetTooltip("QUICKLEARN_CN_FORMATDATE_TOOLTIP");
SetDescription("QUICKLEARN_CN_FORMATDATE_DESCRIPTION");
SetBitmap("QUICKLEARN_CN_FORMATDATE_BITMAP");
//this.HasVariableInputs = true; //参数个数是否不确定
this.SetMinParams(2);//最小参数
this.SetMaxParams(2);//最大参数
SetExternalFunctionName(GetType().Assembly.FullName, "Quicklearn.CN.BTS.CustomerFunctoids.Resource", "Format");
this.Category = FunctoidCategory.String; //分类
this.OutputConnectionType = ConnectionType.All;//输出类型
//设置支持的脚本格式(内联型Functoid需要设置此项).
AddScriptTypeSupport(ScriptType.CSharp);
//内联型的脚本,代码将会被拷贝到XSLT文件中.方便调试.
SetScriptBuffer(ScriptType.CSharp, InitFormat(), 0);
AddInputConnectionType(ConnectionType.All); //第一个参数类型
AddInputConnectionType(ConnectionType.All); //第二个参数类型
}
public string Format(string paramDate,string paramExpress)
{
string responseDate = paramDate;
try
{
DateTime strDate = Convert.ToDateTime(paramDate);
responseDate = strDate.ToString(paramExpress);
}
catch { }
return responseDate;
}
//将方法代码映射到XSLT。
private string InitFormat()
{
StringBuilder builder = new StringBuilder();
builder.Append("public string Format(string paramDate,string paramExpress)n");
builder.Append("{n");
builder.Append(" string responseDate = paramDate;n");
builder.Append(" tryn");
builder.Append("{n");
builder.Append(" DateTime strDate = Convert.ToDateTime(paramDate);n");
builder.Append(" responseDate = strDate.ToString(paramExpress);n");
builder.Append("}n");
builder.Append("catch { }n");
builder.Append("return responseDate;n");
builder.Append("}n");
return builder.ToString();
}
}
}
BizTalk开发系列(二十二) 开发自定义Map Functoid
测试
自定义Functoid 的测试工作非常不方便,简化该过程可以先使用自定义内联脚本或外部程序集的方式先将程序调整完好。另外对于内联Functoid可以将Map生成XSLT 进行详细调试。以下是通过验证Map生成的XSLT内容,内联型的Functoid已经将方法代码拷贝到XSLT中。
XSLT Code
<?xml version="1.0" encoding="UTF-16" ?>
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 userCSharp" version="1.0" xmlns:ns0="http://TestFormatDate.Distenation" xmlns:s0="http://TestFormatDate.Source" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
- <xsl:template match="/">
<xsl:apply-templates select="/s0:Root" />
</xsl:template>
- <xsl:template match="/s0:Root">
- <ns0:Root>
<xsl:variable name="var:v1" select="userCSharp:Format(string(Field1/text()) , "dd-MM-yyyy")" />
- <Field1>
<xsl:value-of select="$var:v1" />
</Field1>
</ns0:Root>
</xsl:template>
- <msxsl:script language="C#" implements-prefix="userCSharp">
- <![CDATA[
public string Format(string paramDate,string paramExpress)
{
string responseDate = paramDate;
try
{
DateTime strDate = Convert.ToDateTime(paramDate);
responseDate = strDate.ToString(paramExpress);
}
catch { }
return responseDate;
}
]]>
</msxsl:script>
</xsl:stylesheet>
BizTalk开发系列(二十三) BizTalk性能指标参考。
BizTalk项目目前比较少,使用的客户也不多。大多只知道BizTalk是一个不错的产品,是MicrosoftSOA平台的核心产品,不过还没有将其应用到生产环境。还有一些客户对BizTalk的性能不是很了解。于是我们做项目的时候也要对BizTalk进行一些相关的性能测试。以下是微软官方的性能指标,可供性能测试的时候做下参考。 CPU 使用率
| 服务器 | 平均 CPU 使用率 |
| BizTalk Server | 55% |
| SQL Server(主 MessageBox 服务器) | 76% |
| SQL Server(其他 MessageBox 服务器) | 83% |
| 服务器 | 平均磁盘空闲时间 |
| 用于所有 SQL Server 的平均值 | 69% |
| 参数 | 值 |
| 每秒平均总锁定超时(每个 SQL Server) | 1980 |
| 平均总锁定等待时间(毫秒) | 495 |
· 在我们的系统中没有明显的资源瓶颈。
· 所有这些指标均处于运行状况良好的范围内。
· CPU 和磁盘空闲时间显示存在大量余量,甚至没有接近限定标准。
· SQL 锁指标正常,在达到约 5000 左右(根据您的 SQL Server)之前 Lock Timeouts/sec 未出现问题,并且锁定等待时间在 1 秒以下也很正常。
BizTalk开发系列(二十四) BizTalk项目框架建议。
Asp.NET有MVC框架,大部份的开发都是按照MVC进行的。BizTalk是面向消息的开发,不能完全采用分层的开发模式。而微软只提供了BizTalk项目开发的基本策略,通过分析相关的Complex项目。还有自己参与的一些BizTalk项目。整理了一下在BizTalk项目框架的建议。
基本原则
对于系统建立一个总体的解决方案。
使用VSTS或VSS 对解决方案进行管理(以下是说明指的是在VSTS的环境下创建解决方案)。
统一开发人员的本地项目目录结构。
将较大的项目拆分为较小的几个项目,(单独DLL大小不超过10M)。
使用统一的测试数据。
文件夹和项目规划
将总体的解决方案根据架构设计分使用文件夹分为不同的区域,例如:BizTalk Applications, Components, Public, Web Applications , WinForm Applications等。在创建解决方案文件夹时要在解决方案的物理文件夹上创建相同的文件夹)。
1. BizTalk Applications子文件夹
Pipelines, Pipeline跟其他项目关系不紧密,强烈建议单独列为一个文件夹。优先使用自己定义的Pipeline。如果系统自带的Pipeline已经有此功能,为了以后修改的方便(新增或删减功能)也建议使用自己创建的Pipeline。
Orchestrations
Maps
Schemas
Exception(如果有提供异常解决方案)
2. Components 子文件夹
Utility 用于创建公共方法或操作
Entity 用于创建实体类
BusinessProcess 用于特定业务需求
3. Public 子文件夹
Keys 用于存放解决方案的Key,最好只用一个。
TestData/Msgs 用于存放Schema生成的实例,还可以用于存放测试数据.
Config 用于存放配置文件或绑定文件。
项目初始化配置
配置安装服务器时使用LOCALHOST或"."(点号)。点号的速度比LOCALHOST快。
配置密钥时使用相对路径。
设置相应的Application Name
注意在配置选项菜单选择所有配置。
对于BizTalk调用的自定义的程序集在部署的时候是需要安装到GAC里的。此时最好用命令将自定义的组件通过生成后事件将其安装到GAC中。
"C
rogramFilesMicrosoftVisualStudio8SDKv2.0Bingacutil.exe"/i"$(TargetPath)"/F
解决方案目录:
系统文件夹目录
作者: ttggl 时间: 2009-5-25 15:09
BizTalk开发系列(二十五) SQL Adapter
SQL Server 是.NET开发的首选数据库。当然开发BizTalk应用程序很多也离不了SQL Server.针对SQLServer的数据操作BizTalk 提供了SQLAdapter作为与数据库交互的接口。本文是一篇基础文章,一部分内容摘自BizTalk的帮助文档。主要介绍了在SQLAdapter使用过程中需要了解或掌握的相关知识。如果您已经很了解BizTalk开发的话欢迎作补充。 SQL适配器由接收和发送适配器组成。 SQL 接收适配器是定期轮询 SQL 结果集的轮询适配器。SQL命令存储在接收位置的配置属性中,可通过适配器架构生成向导程序调用。SQL 接收适配器支持每次运行返回单个 XML 数据格式结果集的SELECT语句和存储过程调用。
SQL 发送适配器,可以将动态创建的 Updategram 或动态调用的存储过程发送到 SQLServer。Updategram 为 XML 片段,用于根据数据库表和列来映射 XML 节点从而在 SQL Server数据库中插入、更新或删除数据。在 Updategram 完成后,SQL Server将返回可选的响应文档,其中包含状态信息以指明更新是否成功。如果在更新期间出现错误,则 SQL 适配器将引发由 BizTalk消息引擎处理的异常。如果将 SQL 发送适配器配置为调用存储过程,则该适配器将以单一 XML 格式的记录集形式返回所有结果。
SQL架构生成向导
新建BizTalk项目,添加生成项目。
在生成适配器的列表中选择SQL.
在数据库连接属性设置中。如果是使用数据库账户登录的话需要选择Allow saving password。否则不能通过向导。
作者: ttggl 时间: 2009-5-25 15:11
在架构信息中的目标命名空间中输入命名空间,端口类型中选择接收或发送端口。发送端口需要输入返回消息的根节点名称。
在输入的SQL脚本需要使用for xml auto 或for xml auto, elements将结果以XML记录集的形式返回。
还可以选择存储过程。在存储过程列表中选择存储过程名称并在表格中给存储参数赋值。参数赋值的时候需要耐心点,不然一不小心就选择NULL了。
完成之后向导生成器就会自动生成Schema。同时也会生成带有该Schema类型的Orchestration。在Orchestration中使用Schema类型跟其他Schema(自定义或生成)的没有什么区别。这里就不介绍了。
使用 Updategram
作者: ttggl 时间: 2009-5-25 15:12
通过使用 updategram ,可以从现有 XML 文档在 Microsoft SQL Server 中修改(插入、更新或删除)数据库。 有关Updategram的详细信息参见: Updategram 简介 (SQLXML 4.0)
所有 Updategram 都包含相同的基本结构:
<InboundRootElementName>
<sync>
<before>
<TableNamecol1='value'col2='value'/>
</before>
<after>
<TableNamecol1='value'col2='value'/>
</after>
</sync>
</InboundRootElementName>
以下定义描述了每个块的角色:
<before>。标识记录实例的现有状态(也称为“之前状态”),并充当 SQL 语句中的 WHERE 子句。
<after>。标识要将数据更改为的新状态。
<sync>。包含 <before> 块和 <after> 块。<sync> 块可以包含多组 <before> 块和 <after> 块。如果存在多组 <before> 块和 <after> 块,则必须成对指定这些块(即使它们为空)。此外,Updategram 可以具有多个 <sync> 块。每个 <sync> 块都是一个事务单元(这意味着 <sync> 中的所有项都在运行,或者都没有运行)。如果在 Updategram 中指定多个 <sync> 块,其中一个 <sync> 块出错将不会影响其他 <sync> 块。
Updategram 是否删除、插入或更新记录实例取决于 <before> 块和 <after> 块的内容:
如果记录实例只出现在 <before> 块中,而在 <after> 块中没有对应的实例,则 Updategram 将执行删除操作。
作者: ttggl 时间: 2009-5-25 15:12
如果记录实例只出现在 <after> 块中,而在 <before> 块中没有对应的实例,则执行插入操作。 如果记录实例出现在 <before> 块中,并在 <after> 块中存在对应的实例,则执行更新操作。在这种情况下,<after> 块中指定的值将更新相应的记录实例。
使用添加生成的项向导,可以选择要对表执行的操作,并生成只支持该操作的架构。例如,如果选择插入操作,则架构中将仅显示 Updategram上的 <before>块。若要生成可用于上述任何操作的多用途架构,请从“要更新的列”列表中选择针对所有列的更新操作。然后,在根据此架构创建 XML实例时可以选择要创建的块。
通过添加生成的项生成的Updategram XML架构。
SQL接收适配器的配置
SQL 接收适配器只能绑定到单向接收端口,在SQL 传输属性对话框中配置需要注意:文档根节点和目标命名空间要跟生成的Schema一致当然你也可以反过来将Schema中的命名空间和根节点调成和Adapter配置的一致再重新部署项目。连接字符串可以通过数据链接属性配置。SQL命令可以根据现有的Schema生成或者手动输入SQL命令或存储过程。
接收配置中的Poll While DataFound属性指定是在存储过程或查询未返回任何结果后才提交其他批,还是在每个轮询间隔提交一个存储过程结果或查询结果。默认为False.指的是在每个轮询间隔提交一个存储过程结果或查询结果。Polling Interval指定轮询请求之间的单位数。Polling Unit ofMeasure 指定轮询请求之间使用的度量单位。
作者: ttggl 时间: 2009-5-25 15:13
最后要介绍一下URI,如果配置的SQL接收端口URI地址与BizTalk现有的一接收端口配置一样的话.端口配置向导会提示该位置已经被使用。但如果你必须要使用这个位置的话则可以手动在UR后面添加I标识来实现。比如:SQL://./pubs/Next
SQL发送适配器的配置
SQL发送适配器的配置比较简单,可以绑定到单向或双向端口。同时注意命名空间、根节点与Schema的一致性。
SQL 适配器的最佳实践
1.优先使用存储过程,对于偶尔执行的操作可以也使用updategram 。
2.避免在接收端口中因重新提交相同数据而产生竞争。最好是在表中设置一个状态字段,以防止在长时间执行业务流程时 SQL 操作向 BizTalk Server 重新发送相同的信息。
3.使用信封消息每次返回多行。SQL 适配器接收函数将限定为只能每分钟处理 60 条消息。
4.如果消息大于 1 MB,则应考虑减少从 SQL Server 返回的行数,以使消息保持在 1 MB 以下。同时建议将连续轮询属性设置为True,以便适配器在单独的批中只提交剩余的行。适配器提交批,直到 SQL Server 计算机返回空的结果集,此时 SQL适配器将释放线程,直到下一个轮询间隔。
SQL 适配器已知问题和解决办法
1.接收函数返回空文档
如果 SELECT 语句或存储过程生成空结果集,则 SQL 适配器接收函数返回的文档只包含根和目标命名空间。
作者: ttggl 时间: 2009-5-25 15:13
如果 SELECT 语句或存储过程包含 xmldata 关键字,就会出现此问题。
若要解决此问题,请删除 SQL 适配器终结点配置中 SELECT 语句或存储过程中的 xmldata 关键字。
2.向 SQL 发送适配器发送 updategram 时收到错误
向 SQL 发送适配器发送 updategram 时,可能会出现接收错误消息“从字符串向 datetime 转换时出现语法错误”。
如果 SQL 表包含日期时间列,并且 updategram 尝试用不正确的值更新该列,则会出现此问题。
若要解决此问题,请不要使用 BizTalk 映射器 functoid 创建要映射到 updategram 的日期时间值。这些 functoid 创建的日期时间值的格式为“1999-05-31T13:20:00.000-05:00”。SQL 日期时间列需要的日期时间值的格式为“1999-05-31T13:20:00.000”。请通过调用 DateTime 类的 Parse 或 ParseExact 方法,而不使用默认的日期和时间 functoid 来手动创建日期时间值。
3.在 updategram 中使用 money 数据类型列
在 SQL 适配器的添加生成的项向导生成一个 updategram 架构时,该向导会在架构中将 money 数据类型列表示为 XSD 类型 decimal。
发生此问题的原因是 SQLXML 要求 updategram 以“$123.45”的格式来传递 money 列。
若要在 updategram 中使用 money 列,请将 updategram 架构中对应于 SQL Server 中 money 列的属性从 xs:decimal 类型更改为 xs:string 类型。将数据映射到此列时,记住要包括前导美元符号。
4.编译错误:‘name’属性值无效
生成项目时,收到编译错误“‘name’属性值无效: 名称不能以 '' 字符(十六进制值 <十六进制值>)开头。file:/<文件位置>.xsd 发生错误。”。
作者: ttggl 时间: 2009-5-25 15:14
如果 SELECT 语句或存储过程遇到要导入到添加适配器向导的非法字符(如 System.Xml.XmlConvert 类中所述),就会出现此问题。
若要纠正此错误,请修改添加适配器向导中定义的 SELECT 语句或存储过程中列出的表名称或列名称,使这些名称包含 System.Xml.XmlConvert 类所定义的合法值。有关 XmlConvert 类支持的字符的详细信息,请参阅 .NET Framework 文档中的 XmlConvert 类。
5.生成的 XML 架构中缺少列
由添加适配器向导所生成的 XML 架构中缺少列。
如果添加适配器向导无法匹配 XSD 数据类型,就会出现此问题。
若要解决此问题,请将列类型 SQL_Variant 更改为支持的数据类型。
6.SQL 传输架构生成向导在 BizTalk Server 中意外关闭
问题: 在 BizTalk Server 2006 中,尝试为 SQL 适配器发送端口生成架构时,SQL 传输架构生成向导意外关闭。如果尝试为以下 updategram 之一生成架构以更新 SQL Server 2005 中的数据库表时,就会出现此问题:
插入 updategram
更新 updategram
删除 updategram
此外,可能会收到类似以下内容的错误消息:
FailedtoexecuteSQLStatement.Pleaseensurethatthesuppliedsyntaxiscorrect.Newtransactioncannotenlistinthespecifiedtransactioncoordinator.
在 SQL Server 2005 中使用 SQL 传输架构生成向导查询数据库表时,可能会收到此错误消息。
原因:
当数据库表中包含以下一种数据类型的列时,就会出现此问题:
varbinary(MAX) 数据类型
varchar(MAX) 数据类型
nvarchar(MAX) 数据类型
xml 数据类型
在 BizTalk Server 中,SQL 适配器不支持这些数据类型。
解决方法:
这些数据类型是 SQL Server 2005 中新增的数据类型。当数据库表中包含其中一种数据类型的列时,请不要在 BizTalk Server 中使用 SQL 适配器向数据库表中插入数据。另外,不要在 BizTalk Server 中使用 SQL 适配器从数据库表中检索数据。
作者: ttggl 时间: 2009-5-25 15:15
BizTalk开发系列(二十六) 使用Web Service 本文示例源代码或素材下载 WebService是在构建SOA平台中广泛使用的技术。在BizTalk开发过程中使用SOAP适配器接收和发送 Web Services请求。业务流程可以发布为 Web Services 并使用外部 Web Services。由于WebService是基于Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等内容比较丰富。这里仅探讨在BizTalk中如何使用Web Service。
如下图所示,我们构造了这样一个场景:数据库中存储Addressbook表。我们通过BizTalk将发布Web Service接收添加数据到数据库表中。如果在数据库操作成功的话则返回受影响的行数。如是失败的话则返回异常信息。
在设计流程过程中,需要添加异常捕获形状接收在数据库操作过程中产生的异常信息。将错误信息借助双向端口的Fault Port将异常信息返回给请求系统。注意在异常处理模块中结束流程,否则会产生错误:
mustreceivebeforesendingamessagewhosemessagetypecorrespondstoarequestreponseoperationonanimplementedport
发布架构为Web Services
BizTalk设计器通过使用BizTalk Web Services发布向导将流程或架构发布为Web Service.MSDN推荐仅将架构发布为Web Service。“如果您想要更详细的解释,那就是松散耦合!这样做使您在更改业务流程时具有更大的自由性,无需中断调用方。”。 虽然不是很赞成松散耦合这个观点,因为通过比较两种方式发布出来的WebServcie最终都是通过注入的方式调用全局缓存的流程类库。
作者: ttggl 时间: 2009-5-25 15:15
但是还是建议仅将架构发布为Web Service。因为如果仅将架构发布为Web Service的话生成的Web Service项目仅在需要使用的Schema.但如果将流程发布为Web Services的话可能一些其他的架构也会暴露在WebServices的项目中。比如上图所示的流程(Schema和流程在一个同项目文件中)中如果使用发布流程的话则在流程中使用的添加数据的架构也会暴露在Web Service中。这样是不太安全的因为数据库操作的架构包含存储过程名称,参数及类型之类的信息。
[通过发布架构产生的Web Service]
[通过发布流程产生的Web Service]
当然直接选择发布流程的话就不需要设置方法和参数名等信息简化了发布的过程。选择哪种方式可以看实际情况而定。
讨论了两种发布方式的区别下面提示Step by Step的方式发布架构为Web Service。
1.在Visual Studio开发环境的工具栏下找到BizTalk Web Service发布向导,或者可以在开始-程序-Microsoft BizTalk Server 2006目录下找到BizTalk Web Service发布向导。
2.在创建 Web Service 页面下选择发布架构为向导。发布流程的方式比较简单将在之后讨论。
作者: ttggl 时间: 2009-5-25 15:16
3.在Web Service定义页面。可以分别对这些节点命名。当然还可以根据实际需要对其项目进行添加、删除、修改等操作。注意方法名称应该与Orchestration设计过程中使用的端口的操作名称一致。
4.输入目标命名空间,这个命名空间是在SOAP请求消息中使用的。所以可以不跟架构中使用的消息一致。
5.选择发布位置,这里的名称是虚拟目录的名称。如果有旧版本的相同名称的话需要选择覆盖安装。另外选择访问方式和为BizTalk程序创建接收位置。
6. 至此将架构发布成了Web Service.窗口中提示的路径是Web Service项目保存的路径。可以直接打开项目源码,(但最好不要做改动,如果不是很熟悉的话。)

同时可以在IIS里查看到新添加的虚拟目录
作者: ttggl 时间: 2009-5-25 15:16
发布流程为Web Service 1. 发布流程为Web Service的过程比较简单,接上面第2步开始选择发布流程为Web Service。
2. 建议在Visual Studio中使用工具菜单下的Web Services发布向导,这样这一步就可以直接定义到项目中的动态库。
3.选择需要发布的流程和端口。
4.后续的部署跟上面是一致的。可以从第4步开始设置。
BizTalk Application绑定相应的Web Service。
这一过程比较简单,如果在发布向导的时候已经选择了为应用程序产生接口的话直接在应用程序配置窗口选择相应的接收位置即可。

BizTalk消费Web Service.
在BizTalk的应用程序中引用Web Service的方法跟一般的.NET应用程序类似。
1.在BizTalk应用程序中添加Web引用
作者: ttggl 时间: 2009-5-25 15:17
2.选择本地计算机上的Web服务,在列表中选择相应的服务。添加相应的名称之后可以在类型窗口查看到相应的端口类型和消息类型。
3.在流程中创建消息时选择对应的Web Message Types。创建端口时也同样使用已经存在的端口类型,即引用Web Services创建的端口类型。
4.项目部署之后,在配置端口时选择类型为SOAP,在配置页面输入Web Service路径。
Web Services的测试
在.NET开发 Web Services的过程中常常会采用页面输入的方式对Web Service进行测试。但是BizTalk生成的Web Service项目已经在Web.Config配置文件中禁止HTTP GET和HTTP POST方法。因此需要通过使用XMLSpy或SoapUI等工具对Web Service进行测试。
我们来测试本次Sample的场景,在SOAPUI中新建一个Project。在请求参数中将“?”更改为相应的数值。发送请求,则返回受影响的行数。测试结果跟预期的一致。
另外,由于我们需要测试返回错误消息的情况因此在数据库中将名称字段设为主键。然后根据发送相同的请求参数返回错误信息。请注意,红线部分是在异常处理模块里通过字符串构造的方法添加的。
总结
经过以上的探讨基本上涵盖了SOAP Adapter的基本应用。
出处 : http://www.cnblogs.com/cbcye/archive/2008/11/13/1332444.html
作者: ttggl 时间: 2009-5-25 15:17
BizTalk开发系列(二十七) 异常管理中的数据编码。
在BizTalk的异常管理解决方案中。大部分是通过订阅相关的升级属性来接收消息,并在自定义的流程或发送端口进行处理。但不管怎样,一般会定义统一的错误消息Schema,这样不仅可以让我们通过异常信息快速的查找错误。还可以方便的跟不同的系统或存储方式做映射。
虽然在BizTalk内部唯一使用Xml文档,但BizTalk所能接受的消息不单单只有XML文档。RAR,ZIP,WMA,WMV等等都是 BizTalk可以接收的消息。这就给BizTalk的异常管理造成了一定的麻烦,因为原消息一般会包含到统一的异常消息里。如果消息在产生异常之前就已经被拆装为相应的XML文档的话则可以很方便的借用XMLDocument对像的OuterXML属性获得原消息的消息体。但是如果消息是在 Adapter或pipeline出错的话则可能消息往往还没有被处理成XML。
在捕获异常消息的时候通常将使用XMLDocument对像进行捕获,但如果直接使用XMLDocumentObject.OuterXML属性获取消息的话则会产生类似如下的错误:
Dataattherootlevelisinvalid.Line1,position1Excepion
因些需要对异常消息进行重新编码。在BizTalk中的所有消息都是XLANGMessage类型的。XLANGMessage类提供与不同数据类型进行转换的功能。如下代码所示,我们先将消息转为Stream,再从Stream专为 String类型。这样我们就可以得到消息的文本内容了。
public static string GetMsgSourceString(XLANGMessage message)
{
string sourceString = string.Empty;
Stream sourceStream = null;
StreamReader streamReader = null;
try
{
sourceStream = (Stream)message[0].RetrieveAs(typeof(Stream));
streamReader = new StreamReader(sourceStream,Encoding.UTF8);
sourceString = streamReader.ReadToEnd();
return sourceString;
}
catch (System.Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("CBCYE.Exception", "Failure to get source from message :" + message.Name, System.Diagnostics.EventLogEntryType.Error);
return sourceString;
}
finally
{
if (null != sourceString)
{
sourceString = null;
}
if (null != sourceStream)
{
sourceStream = null;
}
if (null != streamReader)
{
streamReader = null;
}
}
}
作者: ttggl 时间: 2009-5-25 15:18
BizTalk开发系列(二十七) 异常管理中的数据编码。


但如果原消息是RAR,ZIP等格式的数据话就又不一样了。虽然通过该方法也可以进行编码。但是你看到会是类似下面图的数据(ZIP文件转成String的效果)。文档中有乱码不方便保存和阅读而且很容易使数据无法恢复。
不过问题总会有解决办法的,我们可以使用在Internet中应用非常广泛的Base64编码[1]将数据进行重新编码。在C#中可以使用Convert.ToBase64String与Convert.FromBase64String实现byte[]与string(Base64编码)之间的转换。
public static string GetMsgSourceBase64(XLANGMessage message)
{
string sourceString = string.Empty;
Stream sourceStream = null;
StreamReader streamReader = null;
byte[] buffer = null;
try
{
sourceStream = (Stream)message[0].RetrieveAs(typeof(Stream));
streamReader = new StreamReader(sourceStream, Encoding.UTF8);
sourceString = streamReader.ReadToEnd();
System.Text.ASCIIEncoding accessEncoding = new ASCIIEncoding();
buffer = accessEncoding.GetBytes(sourceString);
sourceString = Convert.ToBase64String(buffer);
return sourceString;
}
catch (System.Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("CBCYE.Exception","Failure to get source from message :" + message.Name,System.Diagnostics.EventLogEntryType.Error);
return sourceString;
}
finally
{
if (null != sourceString)
{
sourceString = null;
}
if (null != sourceStream)
{
sourceStream = null;
}
if (null != streamReader)
{
streamReader = null;
}
if (null != buffer)
{
buffer = null;
}
}
}
经过转换之后同样的Zip文件在文本中存储的数据变成了下图所示.这样的ASCII码字符就不用担心是用Unicode还是UTF-8编码存储。现在绝大多数的语言都是支持Base64的加密与解密的。因此查看与还原原消息也变得很简单了。

最后关于怎么存储异常消息体可以看具体的需求,如果BizTalk接收和发送的的就都是FormattedXML的话就不需要编码了,如果还有Txt,CSV之类的平面的文件的话可以直接返回String,方便查看。最后如果是比较复杂的集成环境就需要使用Base64对数据进行统一编码。还可以使用InfoPath等客户端软件来实现异常管理平台。
[1] Base64是一种使用64基的位置计数法。它使用2的最大次方来代表仅可打印的ASCII字符。这使它可用来作为电子邮件的传输编码。在Base64中的变量使用字符A-Z、a-z和0-9,这样共有62个字符,用来作为开始的64个数字,最后两个用来作为数字的符号在不同的系统中而不同。
作者: ttggl 时间: 2009-5-25 15:19
BizTalk开发系列(二十八) MSMQ 适配器。
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。BizTalk Server 使用MSMQ Adapter向MSMQ发送以及从其接收消息。MSMQ 适配器支持 Message Queuing 2.0 和 Message Queuing 3.0。本文简要的介绍MSMQ的相关概念,演示如何使用MSMQ适配器向发送和接收其消息。最后阐述在使用MSMQ Adapter适配器的相关问题及相关解决办法。
1. MSMQ相关概念
Message 是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
队列类型
有两种主要类别的队列:由您或网络中的其他用户创建的队列和系统队列。用户创建的队列可能是以下任何一种队列:
“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。
“专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。
“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。
“响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。
系统生成的队列一般分为以下几类:
“日记队列”可选地存储发送消息的副本和从队列中移除的消息副本。每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。
“死信队列”存储无法传递或已过期的消息的副本。如果过期消息或无法传递的消息是事务性消息,则被存储在一种特殊的名为“事务性死信队列”的死信队列中。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息,
“报告队列”包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。每台计算机上只能有一个报告队列。
“专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。
在应用程序中进行的大多数工作都涉及访问公共队列及其消息。但是,根据应用程序的日记记录、确认和其他特殊处理需要,在日常操作中很可能要使用几种不同的系统队列。
同步和异步通信
队列通信在本质上是“异步”的,因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外,还可以异步执行接收操作。希望接收消息的用户可以针对任何给定的队列调用 BeginReceive 方法,然后立即执行其他任务,而无需等待回复。这与人们所了解的“同步通信”截然不同。
在同步通信中,请求的发送方在执行其他任务前,必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间。
作者: ttggl 时间: 2009-5-25 15:20
2. 安装和创建消息队列 消息队列服务属于Windows组件,安装时可以在添加/删除程序的 添加/删除Windows组件里找到消息队列组件(有些功能是需要在域环境下才可以安装和使用)。如下图:
安装完MSMQ之后在计算机管理中的服务与应用程序里找到消息队列服务。如果计算机在WorkGroup模式下只能创建私有队列。
3. 演示:MSMQ Adapter
本演示模拟从文件到消息队列和消息队列到文件的两种场景。分别应用到了MSMQ的接收和发送适配器。本演示没有使用到Orchestration,通过Public/Subscribe机制将发送和接收端口串联起来。演示步骤可以参考《BizTalk开发系列(一) "Hello World" 》
创建专用队列
创建消息队列非常简单,在专用队列中右击选择New.在打开的窗口中输入队列的名称。如果需要支持事务的话则选择事务。默认情况下MSMQ的存储位置为:C:WINDOWSsystem32msmqstorage。可以通过更改消息队列的属性进行更改。
创建完毕之后可以在专用队列中打到相应的队列。
MSMQ发送适配器
MSMQ发送适配器的属性比较多,功能很强大。但配置也不是很复杂。比如一般情况下只需要设置目标队列属性即可。但如果你在创建消息队列时选择了事务那么也需要在发送适配器中选择事务。下图是本演示的配置。设置目标队列时只需要输入:“CBCYEPRIVATE$DEMO”。图中显示的格式为转换后的格式。
作者: ttggl 时间: 2009-5-25 15:20
MSDN中关于MSMQ发送适配器属性说明
| 属性 | 操作 | 数据类型 | 默认值 |
| 密码 | 指定远程队列的密码。与“用户名”一起使用。 | 字符串 | 空 |
| 用户名 | 指定远程队列的用户名。与“密码”一起使用。不能使用远程计算机的本地用户作为该用户名。 | 字符串 | 空 |
| 确认类型 | 指定消息队列返回给发送方应用程序的确认消息的类型。您可以选择多个确认类型。System.Messaging.AcknowledgeTypes 枚举中的所有确认类型都可用。 | 字符串 | 无 |
| 管理队列 | 指定接收确认消息的队列的名称。 | 字符串 | 空 |
| 正文类型 | 指定 MSMQ 中的消息正文类型。有效值为 .NET VarEnum 枚举的成员。 | Int | 8209 |
| 证书指纹 | 指定用于消息验证的证书的指纹。此属性与“使用验证”属性结合使用,对消息进行验证。使用“用户名”和“密码”属性可以访问队列。 | 字符串 | 空 |
| 目标队列 | 指定目标队列。 (注意:发送端口或接收位置的 URI 不能超过 256 个字符。 ) | 字符串 | 空 |
| 加密算法 | 对于加密算法,请选择“RC2”、“RC4”或“无”。 | Enum | 无 |
| 最大消息大小(KB) | 指定发送给所指定队列的消息的最大大小。 | UnsignedInt | 1024 |
| 消息优先级 | 设置消息优先级。 | Enum | 正常 |
| 可恢复 | 指定是否确保消息的可恢复性。 | Boolean | False |
| 支持分段 | 如果将此布尔属性的值设置为 True,则会对大于 4 MB 的消息分段。 | Boolean | False |
| 超时 | 指定等待消息到达目标队列的最长时间。只有当使用事务时才适用。 | Int | 0 |
| 超时单位 | 设置用于“超时”属性的单位。 选择“天”、“小时”、“分钟”或“秒”。 | Enum | 天 |
| 事务性 | 如果将此值设置为 True,则会在您使用事务时发送消息。 | Boolean | False |
| 使用验证 | 如果将此布尔属性的值设置为 True,则会控制验证。此属性与“证书指纹”属性结合使用,对消息进行验证。使用“用户名”和“密码”属性可以访问队列。 | Boolean | False |
| 使用死信队列 | 如果将此值设置为 True,则会在出错时向死信队列发送消息。 | Boolean | True |
| 使用日志队列 | 如果将此值设置为 True,则会在处理消息时保存消息的副本。 | Boolean | False |
将测试数据放到文件夹。BizTalk会将它路由到MSMQ Adapter并将它发送到MSMQ中。你可以在计算机管理中的消息队列窗口中看到消息.则表明发送成功。
MSMQ接收适配器
相对来说MSMQ接收适配器的配置就简单很多,只需要配置一下消息队列路径即可。
·MSDN中关于MSMQ发送适配器属性说明
| 区域 | 操作 | 日期类型 | 默认值 |
| 密码 | 设置用于远程队列的密码。 | 字符串 | 空 |
| 用户名 | 确定与密码结合使用以访问远程队列的用户名。不能使用远程计算机的本地用户作为该用户名。 | 字符串 | 空 |
| 批大小 | 配置批大小。MSMQ 适配器将消息分批提交给 MessageBox 数据库。默认的批大小为 20,最小批大小为 1。 注意:如果接收位置的“事务性”属性设置为 True;则各个消息批将在 Microsoft 分布式事务处理协调器 (MSDTC)事务的上下文中提交给 MessageBox 数据库。为消息创建的 MSDTC 事务将始终处于打开状态,直到该批中的所有消息都已保存到MessageBox 数据库并已放置到相应的订户队列中为止。因此,MSDTC事务的持续时间会随着“批大小”参数的增大而增长。由于同时打开大量的 MSDTC事务会降低总体性能,因此在启用事务支持时,“批大小”参数不应设置为太大的值。 | Int | 20 |
| 失败时 | 指定适配器响应错误的方式。将此属性设置为以下值之一: o 停止。如果发生错误,则停止通过此接收位置接收消息。 o 已挂起(不可恢复)。挂起消息并将其标记为不可恢复。 o 已挂起(可恢复)。挂起消息并将其标记为可恢复。 重要说明 如果同时应用“按序处理”属性的“True”选项、“失败时”属性的“停止”选项以及“事务性”属性的“False”选项,则不会挂起送达失败的任何消息或将其保留在源队列中。在此方案中,会发生消息丢失。若要防止消息丢失,在使用“按序处理”功能时,只在应用“事务性”属性的“True”选项时才应用“失败时”属性的“停止”选项。然后,在消息送达失败时,原始消息将会保留在源 MSMQ 队列中。 如果“按序处理”属性的值设为“False”,则“失败时”属性将不起作用,并且如果消息送达失败,则消息将以“已挂起(可恢复)”的状态挂起。 | String | 已挂起(可恢复) |
| 按序处理 | 将此属性设置为 True 或 False。这表示是否按顺序处理消息。在与已将“按序送达”选项设置为 True 的 BizTalk 消息传送或业务流程发送端口一起使用时,将该属性设置为 True 表示允许按序送达消息。 | Boolean | False |
| 队列 | 键入有效的队列路径。根据指定的队列路径,系统将执行相应的验证。 注意: 发送端口或接收位置的 URI 不能超过 256 个字符。 注意: MSMQ 接收适配器使用轮询机制每隔 0.5 秒对为新消息指定的 MSMQ 队列进行监视。此 0.5 秒间隔为固定间隔。 | 字符串 | 空 |
| 事务性 | 将此属性设置为 True 或 False。 注意: 该适配器不支持对远程队列进行事务性读取。 | Boolean | False |
作者: ttggl 时间: 2009-5-25 15:20
测试 MSMQ接收Adapter的轮询时间为0.5秒。根据配置MSMQ接收适配器会从MSMQ从接收消息。BizTalk将消息路由到文件适配器发送端口。如下图所示可以查看到相应的文件信息:
4. MSMQ 适配器相关问题及解决办法[陆续更新]
错误信息: The specified destination queue"FORMATNAME
IRECT=OS:CBCYEPRIVATE$DEMO" is transactional, and themessage is being sent is non-transaction.
解决办法:
在发送适配器属性中将发送端口的事务类型改为True.
错误信息:BizTalk message 6eeed3d2-bd04-48c3-a544-22692eb13121 with size7089.970703125 KB cannot be sent because the configured message size is1024 KB.
原因:消息队列适配器默认消息大小为1M,但发送的数据为7M.另外Windows消息队列默认最大消息为4M.
解决办法:更改适配器的最大消息大于当前的文件大小,并启用消息队列适配器的消息分段功能。下图为启用分段功能之后7M消息被拆分的情况。 在MSMQ接收适配器会将此消息合并为一个消息。发布到Messagebox.
错误信息:
The user does not have permissions to send messages.
或者
The adapter "MSMQ" raised an error message. Details "The user does not have permissions to receive messages.
Please check the queue permissions. ".
原因:BizTalk的当前用户对消息队列没有写入或读取的权限
解决办法:在消息队列属性的安全选项中选择相应用户的权限
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-25 15:21
BizTalk开发系列(二十九) 宏的使用。
在BizTalk中可以使用宏**动态的让BizTalk发送处理程序使用单独的值来替换宏。常用的使用宏的发送程序有:文件发送适配器和SMTP发送适配器。在表达式中可以使用同时使用多个宏。例如:在文件发送适配器的文件名中使用%SourceFileName%_%datetime%_%MessageID%.xml则表达用“_”连接的三个宏值。
使用宏的注意事项
如果存在以下任何一种情况,发送处理程序将不会使用值替换宏:
未设置相应的系统属性。
宏拼写错误。
宏的值所包含的符号在文件名中无效。
如果出现上述任何情况,发送处理程序都会将宏保持不变,例如 Myfile_%MessageID%.xml。
文件适配器中可以使用宏的列表
| 宏名称 | 替代值 | ||
| %datetime% | YYYY-MM-DDThhmmss 格式的世界时 (UTC) 日期时间(例如 1997-07-12T103508)。 | ||
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | ||
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | ||
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | ||
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | ||
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值直接来自消息上下文属性 BTS.MessageID。 | ||
| %SourceFileName% | 文件适配器从中读取消息的文件的名称。文件名包括扩展名,但不包括文件路径,例如 Sample.xml。在替代此属性时,文件适配器从FILE.ReceivedFileName上下文属性中存储的绝对文件路径提取文件名。如果上下文属性没有值(例如,如果消息是在文件适配器之外的其他适配器上接收到的),则将不替代该宏,并在文件名中按原样保留该宏(例如 C rop%SourceFileName%)。
| ||
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。
| ||
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。
| ||
| %time% | hhmmss 格式的 UTC 时间。 | ||
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 |
| 宏 | 说明 | 用于与“收件人”一起使用 | 用于与“抄送”一起使用 | 用于与“主题”一起使用 |
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值来自消息上下文属性 BTS.MessageID。 | 否 | 否 | 是 |
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | 否 | 否 | 是 |
| %datetime% | YYYY-MM-DDThhmmss 格式的 UTC 日期时间(例如 1997-07-12T103508)。 | 否 | 否 | 是 |
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | 否 | 否 | 是 |
| %time% | hhmmss 格式的 UTC 时间。 | 否 | 否 | 是 |
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 | 否 | 否 | 是 |
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。 | 是 | 是 | 是 |
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。 | 是 | 是 | 是 |
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | 是 | 是 | 是 |
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | 是 | 是 | 是 |
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-26 11:33
BizTalk开发系列(二十九) 宏的使用。
在BizTalk中可以使用宏**动态的让BizTalk发送处理程序使用单独的值来替换宏。常用的使用宏的发送程序有:文件发送适配器和SMTP发送适配器。在表达式中可以使用同时使用多个宏。例如:在文件发送适配器的文件名中使用%SourceFileName%_%datetime%_%MessageID%.xml则表达用“_”连接的三个宏值。
使用宏的注意事项
如果存在以下任何一种情况,发送处理程序将不会使用值替换宏:
未设置相应的系统属性。
宏拼写错误。
宏的值所包含的符号在文件名中无效。
如果出现上述任何情况,发送处理程序都会将宏保持不变,例如 Myfile_%MessageID%.xml。
文件适配器中可以使用宏的列表
| 宏名称 | 替代值 | ||
| %datetime% | YYYY-MM-DDThhmmss 格式的世界时 (UTC) 日期时间(例如 1997-07-12T103508)。 | ||
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | ||
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | ||
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | ||
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | ||
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值直接来自消息上下文属性 BTS.MessageID。 | ||
| %SourceFileName% | 文件适配器从中读取消息的文件的名称。文件名包括扩展名,但不包括文件路径,例如 Sample.xml。在替代此属性时,文件适配器从FILE.ReceivedFileName上下文属性中存储的绝对文件路径提取文件名。如果上下文属性没有值(例如,如果消息是在文件适配器之外的其他适配器上接收到的),则将不替代该宏,并在文件名中按原样保留该宏(例如 C rop%SourceFileName%)。
| ||
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。
| ||
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。
| ||
| %time% | hhmmss 格式的 UTC 时间。 | ||
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 |
| 宏 | 说明 | 用于与“收件人”一起使用 | 用于与“抄送”一起使用 | 用于与“主题”一起使用 |
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值来自消息上下文属性 BTS.MessageID。 | 否 | 否 | 是 |
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | 否 | 否 | 是 |
| %datetime% | YYYY-MM-DDThhmmss 格式的 UTC 日期时间(例如 1997-07-12T103508)。 | 否 | 否 | 是 |
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | 否 | 否 | 是 |
| %time% | hhmmss 格式的 UTC 时间。 | 否 | 否 | 是 |
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 | 否 | 否 | 是 |
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。 | 是 | 是 | 是 |
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。 | 是 | 是 | 是 |
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | 是 | 是 | 是 |
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | 是 | 是 | 是 |
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-26 11:33
BizTalk开发系列(三十)单向端口实现请求-响应。
BizTalk本质上是异步的消息处理引擎。BizTalk的请求与响应模式是基于异步之上的同步消息交换。消息引擎通过消息的扩展架构链接许多异步消息,消息的相关集关联请求与响应消息。例如,客户端发送一个SOAP请求到BizTalk SOAP适配器。连接该WebService的BizTalkOrchestration接收处理消息。并返回一个SOAP响应消息。对于客户端程序来说是一个同步的SOAP请求。但在引擎内部则是通过并联交换许多的异步消息来实现。
以下是请求-响应模式中的五个架构属性:
BTS.CorrelationToken 允许响应消息路由到请求-响应端口。
BTS.EpmRRCorrelationToken 用于内部的消息引擎指定请求-响应消息流的服务器名称,处理ID和唯一的GUID。
BTS.IsRequestResponse 指定是否是请求-响应消息
BTS.ReqRespTransmitPipelineID
BTS.RouteDirectToTp 用于内部消息引擎允许循环回调请求-响应消息。
基于以上介绍大概了解了双向端口(请求-响应模式)在BizTalk内部的交换原理,我们的想法是通过单向端口来实现双向端口的功能,理论上大体是这样的:创建一个单向端口接收来自Web Service的请求,在Orchestration中通过消息属性订阅消息,Orchestration接到消息之后处理消息,比如创建一个同样的消息(拷贝相应的属性),并修改相应字段的值。新的消息通过发送形状发布到MessageBox中,并初始化相关集。消息引擎根据消息的相关集设置将消息返回给请求与响应端口。
下图是根据理论分析创建的流程图,流程图非常的简单,接收与发送端口都是使用Direct端口类型Receive接收形状使用Filter从Messagebox从MessageBox订阅消息。Send发送形状则是将消息发布到Messagebox。
作者: ttggl 时间: 2009-5-26 11:34
在Construct New Message形状里的表达式语句如下,通过创建新的消息并指定相关集的值。
System.Diagnostics.EventLog.WriteEntry("TwoWayDemo","Begin Process
");
OutMsg = InMsg;
OutMsg(*) = InMsg(*);
OutMsg.Body.Field="cbcye@live.com";
OutMsg.Header.State="Completed";
作者: ttggl 时间: 2009-5-26 11:34
BizTalk开发系列(三十)单向端口实现请求-响应。
OutMsg(BTS.RouteDirectToTP)=true;
System.Diagnostics.EventLog.WriteEntry("TwoWayDemo","Completed Process
");
BizTalk项目部署之后需要将Schema发布为WebService.并在BizTalk应用程序中创建接收端口,由于Orchestration是通过属性订阅消息所以需要在SOAP接收位置中使用XMLReceive Pipeline。最后我们通过soapUI测试WebService可以看到我们的SOAP请求已经的成功的被Orchestration处理并返回处理结果。
总结
以上简单的Demo涉及到的BizTalk相关知识比较多比如发布/订阅机制,相关集,SOAP适配器的使用等。不过理解该Demo相信对于BizTalk的架构领会是一个不小的跨越。最后说明一点这里所指的单向端口是指Orchestration中的单向端口。Web Service发布的端口是双向的。
作者: ttggl 时间: 2009-5-26 11:35
BizTalk开发系列(三十一)配置和使用HTTP适配器。
BizTalk的主机分别进程内主机和**主机。但由于一直使用的是进程内主机,对于**主机的认识比较模糊,前不久在做一个BizTalk的项目的时候,个别系统使用HTTP的方式发布Txt之类的文本的。刚好HTTP适配器与其他的适配器有一点不同就是它的接收适配器是宿主在**主机(IIS)上。在使用的时候需要进行额外的配置。现在我们就来看一下运行于**主机上的HTTP接收适配器的使用,以及运行于进程内主机的发送适配器的使用。
为 HTTP 接收位置配置 IIS
BizTalk主机分为进程内主机和进程外主机,进程内主机是指宿主在BizTalk运行时进程的主机,**主机是指是作为外部进程(如 ISAPI扩展和 ASP.NET)适配器的宿主。因此在配置HTTP接收位置之前需要先配置IIS的BizTalk接收适配器扩展。
1.首先打开IIS管理器,在Web服务扩展中添加一个新的Web服务扩展。
2.在新的Web扩展中输入扩展的名称和位置,BizTalk扩展的位置一般在:C
rogram FilesMicrosoft BizTalkServer 2006HttpReceiveBTSHTTPReceive.dll 。最后选择设置扩展状态为允许。
3.设置完成之后,可以在IIS的Web服务扩展中查看到新添加的扩展。
作者: ttggl 时间: 2009-5-26 11:35
配置接收位置 之前讲到了HTTP适配器是运行于**主机的,因此配置接收位置的时候跟其他适配器有一点不同,也就是除了在BizTalk应用程序里配置之外还需要在**主机(IIS)上进行配置。
1. 在IIS上创建接收位置的位置比较简单,只需要在IIS上创建一个虚拟目录,将目录的地址指向BizTalkHTTP扩展DLL的目录。不过有两点需要注意,一是为发安全起见将虚拟目录的运行模式选择读取和执行,另外如果需要使用隔离级别需要创建一个**的运行池,运行池的帐户要存在于BizTalk Isolated Hosts 和 IIS_WPG组中。并且需要给虚拟目录指定运行池。
为运行池指定用户
为虚拟目录指定运行池
至此您可能会试着去访问此接收位置,由于还未在BizTalk Application中配置接收位置,因此访问时您会收到HTTP 500的错误。不过BizTalk在事件日志中给出了友好的提示,如下。如果在配置或运行过程中出现错误也可以参考这些信息解决。
The BizTalk HTTP receive adapter failed to initialize itself. Possible reasons:
1) Receive location URL is not created/configured correctly.
2) Receive location is not enabled.
3) HTTP receive adapter is not running under a user that has access to management and message databases.
4) Isolated host instance is not created for HTTP Receive adapter.
作者: ttggl 时间: 2009-5-26 11:35
2. 在BizTalk的Application中配置HTTP接收位置。如下图所示,只需要配置虚拟目录地址即可。
测试
在测试之前我们需要创建一个发送端口来接收来自HTTP接收端口发布的消息。HTTP接收适配器支持Get和Post方法的请求。Get方式的测试我们可以直接在URL后面加上问号再加上您要的请求的数据即可。
Post方法我们可以自己写代码,也可以借用第三方的工具。这里使用的是Fiddler。一个很强大的免费的HTTP Debuger工具。
配置发送端口
由于HTTP的发送适配器是运行于进程内主机的因此配置比接收适配器要简单点,只需要配置目标HTTP路径即可(如果安全上的问题)
测试
基于之前创建好的接收位置,我们在HTTP的发送端口端口订阅从HTTP接收适配器发布过来的消息。同时新建一个Aspx的页面。将接收到的请求数据写到日志(测试时使用小量数据)。
System.IO.StreamReader qr = new System.IO.StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
string uriString = qr.ReadToEnd();
if (!string.IsNullOrEmpty(uriString))
{
System.Diagnostics.EventLog.WriteEntry("HTTPDemo", "Content:rn" + uriString);
}
作者: ttggl 时间: 2009-5-26 11:36
发布HTTP请求之后我们可以在日志中查看到相应的记录。
使用HTTP适配器接收Txt之类的文本.
之所以把接收文本提出来是因为HTTP的接收适配器是宿主在IIS上的,需要请求方主动的请求该路径才可以。但有些系统可能它是通过HTTP的方式将文本发布出来的。比如http://www.cbcye.com/demo.txt这样路径。所以不能使用HTTP接收适配器去主动请求Txt.那么这个任务就落在了发送适配器上面,但是发送适配器只支持POST方法,Txt文本是无法通过POST方法得到的。
所以需要创建一个接收代理(Aspx页面),代理的作用是接收发送适配器上的请求,然后通过以下的代码向目标路径获取文本数据,并将数据返回,被发送适配器的接收方法获得。需要注意的是需要将前台页面的代码去除。这样才能将接收到的Txt信息原样的返回。
System.IO.StreamReader qr = new System.IO.StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
string uriString = qr.ReadToEnd();
if (!string.IsNullOrEmpty(uriString))
{
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uriString);
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN;rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.21022)";
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
Response.Write(sr.ReadToEnd());
}
作者: ttggl 时间: 2009-5-26 11:36
BizTalk开发系列(三十二)浅谈BizTalk主机性能优化。
很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率。但默认情况下BizTalk的主机有很多阻止参数会控制 BizTalk对服务器的资源使用率,从而约束了BizTalk的效率。之前做了一个200万条CSV数据通过BizTalk传到数据库的程序。在不改变程序的情况下对主机性能做了一下简单优化,处理效率发生了成倍的增长。
程序逻辑
先简单的介绍一下程序的处理逻辑,CSV原文件大概有200多万条数据,文件大小50多M。每条只有两个字段总长度大概有三十个字符左右。进Pipeline之后由XML Disambler进行拆分,经过Orchestration拆分之后以每个XML 5000条数据进行处理。之后还需要经过其他 Orchestration的订阅与处理。最后将数据存储到SQL Server中。从CSV到SQL Server Table一共需要经过5个变化也就是经过一次拆分和三次Map。
软硬件环境
硬件环境: Intel Xeon E5405 2.00Ghz X2 , 4GB , 74G X 8 RAID 5
软件环境:Windows Server 2003 Enterprise R2 32bit + BizTalk Server 2006 Enterprise R2 32bit + SQL Server 2005 Enterprise R2 32bit
虽然大家可能知道很多方法可以解决这个问题,比如数据库命令,SSIS,自定义Adapter,自定义Pipeline等,但关于程序的优化和合理性我们不在这里讨论因为项目有自己实际的问题,我们主要来看一下在不修改程序的情况下如果通过简单的优化主机性能达到性能的大幅度提高。
在优化之前(使用BizTalk默认设置)虽然我的程序也可以运行,但遇到了两个问题:一个是CPU的利用率很低一般情况下都在20%左右徘徊,磁盘读写效率也不高一般都在20M/s以下。二是数据库的数据不连续,也就是偶尔才会有数据往数据库里添加数据。不是连续的产生数据。所有数据跑完的时间大概需要2小时左右。
作者: ttggl 时间: 2009-5-26 11:36
在优化之前我们需要了解一下两个概念: 主机阻止和CLR 宿主线程值。
主机阻止
在 BizTalk Server 上执行的大部分处理都在称为 BizTalk Server 主机实例的逻辑实体内进行,该逻辑实体是在 BizTalk Server 上以 Windows 服务或**的主机进程运行的进程。为了管理主机实例进程使用的资源,BizTalk Server 使用可调整的阻止机制控制消息在主机实例中的传输和处理。
该阻止机制对主机实例的负载进行调节,以确保负载没有超过主机实例或任何下游主机实例的处理能力。该阻止机制还防止称为资源争用的情况发生,这种情况会降低主机实例进程或其他系统进程的整体性能。一个或多个进程消耗有限的资源从而损害进程自身和/或其他进程时,便会出现资源争用的情况。例如,消耗过量的内存或线程将导致内存分配失败或大量的线程上下文切换,这会影响进程的性能。这样的资源争用会降低 BizTalk Server 的整体性能。
主机阻止机制还检测可用资源利用不足的时间。如果可用的资源未得到充分利用,则阻止机制将允许主机实例处理更多的消息。主机阻止机制不断监视可用资源是否过度利用或利用不足,并据以调整通过主机实例的消息流。
总之,BizTalk Server 主机阻止机制有助于确保系统以最佳可持续水平运行。
主机的CLR 宿主线程值
Windows 线程是 Windows 进程可用的最基本的可执行单元,因此,有必要为与 BizTalk 主机实例相关联的 .NET 线程池分配足够的线程以防止线程不足。线程不足时,没有足够的线程用于执行请求的作业,因此会对性能造成负面影响。同时应注意防止为与主机相关联的 .NET 线程池分配不必要的过多线程。为与主机相关联的 .NET 线程池分配过多的线程会增加上下文切换。Windows 内核从运行一个线程切换到运行另一个线程时,会发生上下文切换,这会带来性能开销。分配过多的线程会产生过多的上下文切换,这会对总体性能产生负面影响。
作者: ttggl 时间: 2009-5-26 11:37
通过在 BizTalk Server 的注册表中创建相应的 CLR Hosting 值,可以修改与 BizTalk 主机的实例相关联的 .NET 线程池中可用的 Windows 线程数。 优化实战
当然对于BizTalk的性能优化是一个复杂的事情。微软也提供也相应的分析工具和指南,但这些实现起来都比较麻烦,而且可能多人都喜欢偷懒,不喜欢看这些分析的数据和使用这些工具。现在我们就来简单的做一下优化,优化主有有几个方面,一个是修改主机的阻止参数,一个是注册表参数的优化(一些高级的功能都藏在注册表里^_^)。
以下是我修改之后的参数设置,各主机阻止参数的含义大家可以通过查看帮助文档(规划可持续性能 > 引擎性能特性 > 通过主机阻止优化资源使用 >如何修改默认的主机阻止设置)了解,有些属性设置为0是指不启用主机阻止,也就是使用服务器最大资源。
1. 主机属性
2.阻止阈值
3.消息发布阻止设置
4. 消息处理阻止设置
作者: ttggl 时间: 2009-5-26 11:38
5.修改.NET宿主线程值 Regedit.exe->HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesBTSSvcguid,其中 guid 是每个 BizTalk Server 主机实例的唯一 GUID
6.调整消息大小阈值
在映射期间,高于此阈值的文档将缓冲到文件系统中。修改该大小阈值,请在 BizTalk Server 注册表的以下位置处创建一个名为 TransformThreshold 的 DWORD 值:
HKLMSoftwareMicrosoftBizTalk Server3.0AdministrationTransformThreshold
输入一个要设置为新阈值的字节数的十进制值: 8000000
优化结果
通过简单的优化之后数据的处理时间从原来的将近2小时缩短到了25分钟左右,服务器的CPU,磁盘读写利用率也得到了大幅度的提高。还有数据库的数据基本上可以连续的产生。
CPU使用率平均在50%左右,有数据存储到SQL Server时会达到90%以上。
磁盘写数据速率达到了52M
总结
性能优化是个复杂的问题,需要经过大量的测试,而且由于项目和环境的需要面对的问题也不一样,程序的瓶颈也不一样。需要按实际情况解决。当然如果在程序设计和开过过程中充分考虑各产品的性能特点,优化程序的架构和处理方式应该是上上策。希望通过本文起到抛砖引玉的作用。大家在性能优化方面有什么经验也可以交流交流。最后声明一下:以上数据仅供参考!
作者: ttggl 时间: 2009-5-26 11:38
BizTalk开发系列(三十三)BizTalk之Excel终极解决方案。
Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapter支持各种协议及应用程序. 不过非常可惜没有提供对富客户端程序Excel的"原生态"支持. 所以我们只能自己查找解决办法。
应用程序对Excel的支持网上已经有很多解决方案的,一部分是使用ODBC的excel驱动将Excel作为数据源进行处理,对于规范数据表之类的Excel文档这种方法比较适用. Karen之前也发布了一个BizTalk Pipeline 的Excel组件 .另外对于复杂类型的Excel文档有一种解决方案是使用Excel API操作Excel单元格进行处理.但是这种方法不能适应快速开发的需求.当客户的Excel模板发生变化的时候就需要编写相应的代码.费时又费力.
那么什么才是好的解决方案呢? 大概列了几项期望:
快速友好的开发方法.
较强的校验功能
保留Excel原有的强大功能.
终端用户良好的体验.
接下来将要请我们的主角上场- “XML 映射”. XML映射允许将自定义的Schema添加到工作薄,提高了对使用本机 XML的支持。这样可以创建一个 XML 映射,用于在导入或导出数据时使数据变得更有意义。也可以导入符合自定义 XML词汇或架构的数据,然后使用相同的Schema将该数据写回去。下图是一张将XML Schema节点与Excel表格关联的截图。
作者: ttggl 时间: 2009-5-26 11:39
了解了XML映射我们以一个案例的形式来更直观的介绍一下在BizTalk在对于Excel的解决方案。我们都知道很多公司都要求新入职的员工要按照公司统一的简历模板重新填写一份个人简历. 下面是一个通过简历模板填写完的Excel文档.我们希望员工通过邮箱或Web Site提交文档.然后通过BizTalk系统将简历信息存储到数据库或者发送到相应的目录。
要实现这样的目标,使用ODBC的Excel驱动肯定是不行的,因为它不是有一个规范的数据表。如果使用API对操作单元格的话开发量又太大。而且如果模板需要变动的话那么还得重新开发程序。有了XML映射我们的过程会简单而且有趣很多。
1.首先我们创建一个Schema文档定义我们需要的节点及其结构。如下图所示。
2. 创建一个Excel文档,为了给终端用户更好的使用体验我们还要对文档增加一些必要的说明和提示。创建完之后加载XMLSchema并且将Schema的节点与文档的单元格关联起来。下图是一个GIF动画,展示了如何将Schema节点与单元格关联起来的过程。
作者: ttggl 时间: 2009-5-26 11:39
3. 到此Excel的模板就制作完成了,我们只需要把这个模板分布给用户就可以了。
4.下面我们就要来在BizTalk服务器上作些开发了。由于BizTalk没有提供对于Excel文档的运行因此我们需要根据ExcelAPI开发一个Pipeline 组件在存储到MessageBox之前将Excel按照XML映射将Excel Stream转为XMLStream. 下图为Excel Component在Receive Pipeline设计时的应用。
5. 部署BizTalk 应用程序之后,我们就可以开始测试我们的程序。首先们还是一样使用发送和接收文档适配器。来简单的实现将Excel处理成XML的过程。当我们把Excel文档拷贝到接收目录之后我们可以在发送目录看到如下内容的XML文档。
生成之后的XML Document
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:EmployeeResume xmlns:ns1="http://www.cbcye.com/BizTalk/Excel">
<BasicInformation>
<Name>张城斌(Gary Zhang)</Name>
<CellPhoneNumber>xxxxxxxxxxx</CellPhoneNumber>
<E-mail>cbcye@live.com</E-mail>
</BasicInformation>
<WorkingExperience>
<Work>
<Company>CBCYE.COM</Company>
<Position>CEO</Position>
<Period>04-08</Period>
</Work>
</WorkingExperience>
<ProjectExperience>
<Project>
<ProjectName>CBCYE.COM</ProjectName>
<Technology>BizTalk</Technology>
<Position>CEO</Position>
<MajorResponsibilities>Management</MajorResponsibilities>
<Period>04~05</Period>
</Project>
<Project>
<ProjectName>Quicklearn.cn</ProjectName>
<Technology>Asp.NET</Technology>
<Position>CEO</Position>
<MajorResponsibilities>Management</MajorResponsibilities>
<Period>05~06</Period>
</Project>
</ProjectExperience>
<Educations>
<Education>
<School>CBCYE.COM</School>
<Period>03-07</Period>
</Education>
</Educations>
<Languages>
<Language>
<Language>闽南语</Language>
<Level>母语</Level>
</Language>
</Languages>
<TechnicalSkills>
<TechnicalSkill>
<Technical>BizTalk</Technical>
<Level>了解</Level>
<Experience/>
</TechnicalSkill>
</TechnicalSkills>
<Comments>
<Comment/>
</Comments>
</ns1:EmployeeResume>
作者: ttggl 时间: 2009-5-26 11:40
6. OK,我们的最小原型实现了。其他的业务流程和发送目标可以按照实际需要实现。
7. 关于文档内容的校验,我们可以结合Schema的验证功能XML进行校验。这一部分的内容可以参考:BizTalk开发系列(十三) Schema设计之值约束
总结
虽然今天只介绍了XML映射在BizTalk对于Excel文档解析方面的应用,但XML映射不仅可以应用到BizTalk应用程序,也不仅在 BizTalk对于Excel的接收和解析方面。还可以在Asp.NET等其他应用程序和将XML文档输出到Excel等情况。总之在Excel与XML 相关的解决方案中XML映射给我们带来了非常灵活和良好的体验。
作者: ttggl 时间: 2009-5-26 11:41
BizTalk开发系列(三十四) Xpath。
XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk。但是如果对Xpath有一定了解的话,在很多应用下会使你的开发更加快捷。为了方便查阅整理了一些Xpath常识和实际实例给开发过程提供个参考。由于BizTalk还未支持Xpath2.0,所以以下的例子都是基于W3C 1.0规范。
Xpath的重要性 [实际的场景] 之前做一个升级的项目,在项目中需要对XML进行节点查找并比较里面相应的值,通过比较结果再选取它的父节点。由于接收到的XML文件节点值经常会多带一些空格。所以原有的系统是在自定义类库中循环选择节点值,删除左右空格然后再比较,取值。当然在还没有了解Xpath之前这么做可以。但了解了之后可以使用更简单的方法就可以解决了。接下来我会在下面提到解决办法。
基础及概念 XPath 使用路径表达式在 XML文档中选取节点。Xpath的路径包括绝对路径(以斜杠开头)和相对路径(不以斜杠开头)。节点是通过沿着步(step)来选取的,步与步之间使用斜杠("/") 分割。通常我们使用的Xpath表达式例如:/Root/Person其实是步的一种简写方式,如果使用步的语法来写的话应该是:/child::Root/child:
erson
步包括:
轴(axis) 定义所选节点与当前节点之间的树关系
节点测试(node-test) 识别某个轴内部的节点
零个或者更多谓语(predicate) 更深入地提炼所选的节点集
语法:
轴名称::节点测试[谓语]
下面列出了最常用的路径表达式:
| 表达式 | 描述 |
| nodename | 选取此节点的所有子节点 |
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |
父(Parent)每个元素以及属性都有一个父。
子(Children)元素节点可有零个、一个或多个子。
同胞(Sibling)拥有相同的父的节点。
先辈(Ancestor)某节点的父、父的父,等等。
后代(Descendant)某个节点的子,子的子,等等。
作者: ttggl 时间: 2009-5-26 11:42
以上都是一些概念上的东西,不太理解也没有关系,只是为了统一一下概念而以。下面结合实例来和大家一起讲探讨一下Xpath在实际开发过程中的应用。可能有一些是比较基础的,就纯粹当个参考。 Xpath实践
在做实例前先准备一下执行Xpath的环境,XML Spy是一款比较好的XML相关的开发测试工具,只可惜是收费的。如果有条件的话建议还是使用XMLSpy。另外免费的工具里也有不错的选择,SketchPath就是其中的一款,下图为SketchPath的使用过程截图,该工具可以自动高亮显示Xpath查询的区域,底部还带有函数提醒功能等,比较适合在学习中使用。 
测试使用的XML源
选择节点
| 表达式 | 描述 |
| Root | 选取此节点的所有子节点 |
| /Root | 选取根元素 Root 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
| Root/Person | 选取所有属于 Root 的子元素的 Person 元素。 |
| //Name | 选取所有 Name 子元素,而不管它们在文档中的位置。 |
| Root//Name | 选择所有属于 Root 元素的后代的 Name 元素,而不管它们位于 Root 之下的什么位置 |
| //@lang | 选取所有名为 lang 的属性 |
| /Root/Person/* | 选取 Person 元素的所有子节点 |
| //* | 选取所有的元素 |
| //Person[@*] | 选取所有带属性的Person元素 |
| /Root/Person[1]/Name | /Root/Person[1]/Blog | 选取第一个Person节点下的Name和Blog节点 |
作者: ttggl 时间: 2009-5-26 11:42
谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。
| 表达式 | 描述 |
| /Root/Person[1] | 选取属于 Root 子元素的第一个 Person 元素。 |
| /Root/Person[last()] | 选取属于 Root 子元素的最后一个 Person 元素。 |
| /Root/Person[last()-1] | 选取属于 Root 子元素的倒数第二个 Person 元素。 |
| /Root/Person[position()<3] | 选取属于 Root 子元素的前两个 Person 元素。 |
| //Person[@ID] | 选取所有拥有名为 ID 的属性的 Person 元素。 |
| //Person[@ID="1001"] | 选取所有 Person 元素,且这些元素拥有值为 1001 的 ID 属性。 |
| /Root/Person[@ID>1001]/Blog | 选取所有 Root 元素的 Person 元素的Blog元素,且其中的 Person元素的ID 属性的值须大于 1001。 |
函数:fn:local-name()
说明:返回当前节点的名称或指定节点集中的第一个节点 - 不带有命名空间前缀,由于在BizTalk中使用的XML一般是含有命名空间约束的,因此使用这个函数可以根据节点的名称来查找而不用管命名空间是否匹配。
例子:/Root/Person[1]/*[local-name()="Email"] 结果:返回所有节点名称为Email的节点。注意:由于示例的XML文档的Email节点受命名空间约束,所以使用/Root/Person[1]/Email的方式是取不到值的。
函数:fn:namespace-uri()
说明:返回当前节点或指定节点集中第一个节点的命名空间 URI
例子:/Root/Person[1]/*[local-name()="Email"]/namespace-uri() 结果: www.quicklearn.cn
函数:fn:count((item,item,...))
说明:返回节点的数量
例子:count(/Root/Person) 结果:2
函数:fn:normalize-space(string)
fn:normalize-space()
删除指定字符串的开头和结尾的空白,并把内部的所有空白序列替换为一个,然后返回结果。如果没有 string 参数,则处理当前节点。
例子:normalize-space(" The Space ") 结果: The Space
这个函数也是前文中提到的解决办法,具体使用大家自己试一下吧。
作者: ttggl 时间: 2009-5-26 11:43
其他例子
| 表达式 | 描述 |
| /Root/Person/Name[@lang="en"]/preceding::Blog | 选取Name节点中lang属性值为en的同级Blog节点 |
| string(/Root/Person[1]/Name/text()) | 选取第一个Person节点下的Name节点值,并以string类型输出 |
| number(/Root/Person[1]/@ID) | 选取第一个Person节点下的ID属性值,并以number类型输出 |
| /Root/Person/Name[@lang="en"]/../*[local-name()="Email"]/text() | 选取Name节点中lang属性值为en的节点的同级节点Email的值 |
XML Path Language (XPath) Version 1.0
Xpath
函数列表
Xpath轴
作者: ttggl 时间: 2009-5-26 11:43
BizTalk开发系列(三十五) TCP/IP 适配器。
BizTalk 的TCP/IP适配器最初是为英国的保健行业开发。该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯。
TCP/IP适配器支持以下几种交互模式:
Request Only 消息被发送到BizTalk并路由到任何流程(Orchestration)或发送端口。
Request-Response 消息被发送到BizTalk并接收从BizTalk返回的远端服务器的返回信息。
Solicit Only 消息从BizTalk发送到远端服务器。
Solicit-Response 消息从BizTalk发送到远端服务器,并接收远端服务器的返回信息。
Dynamic Solicit 动态发送。
Duplex Request 客户端的全双工请求。
Duplex Solicit BizTalk的全双工请求。
使用前的准备与安装
由于BizTalk不自带TCP/IP适配器,因此在使用之前需要先到CodePlex的BTSTCPIP站点上去下载安装文件,安装过程比较简单,但是需要注意的是在安装之后或者在安装过程中需要对文件对话框里的配置文件内容手动添加到BizTalk的运行时配置文件(BTSNTSvc.exe.config)。
否则在运行时会出现 “The type initializer for 'Microsoft.Samples.BizTalk.Adapter.Tcp.Receive.ReceiveAdapter' threw an exception.”的异常。
添加适配器
安装完毕之后需要在BizTalk管理控制台添加该适配器,以过程是为了给TCP/IP适配器创建相应的接收和发送主机。
作者: ttggl 时间: 2009-5-26 11:44
在适配器的属性配置窗口,输入相应的适器名称,在适配器选项列表中选择适配器,应用之后就会在右侧的窗口看到该适配器的接收和发送主机。
演示
该适配器具体的说明可以参考安装目录下的《TCPIP Adapter UserGuide》,在以下的演示时我们同时将使用到安装目录下的:TcpClient.exe,TcpServer.exe工具。分别作为TCP请求客户端和TCP服务器。如果对TCP传输的内容感兴趣的话也可以使用tcpTrace(第三方工具)来监听传输过程中的数据包。
以下要演示的是比较好理解的两个场景,一个是单向请求和双向请求。演示的逻辑是在BizTalk先创建一个TCP/IP的接收端口,用来监听来自TCPClient.exe发送的请求。再创建一个发送端口订阅来自相应接收端口传过来的数据。并该消息发送到TCPServer.exe。具体的配置过程可以参考用户手册。
单向请求
1.接收端口配置
2.TCP接收适配器属性配置
作者: ttggl 时间: 2009-5-26 11:44
3.发送端口配置
4.TCP发送适配器属性配置
5.结果
双向请求
配置步骤与单向的基本一致,只是在创建端口时选择双向的端口类型即可。
1.TCPServer的配置
2.请求与结果
作者: ttggl 时间: 2009-5-26 11:45
在TCP适配器配置中所使用的[S],[E]是接收适配器识别的起止符,不能修改。而[start],[end]为返回数据的起止符可以修改。另外TCP/IP适配器还支持双工访问,等整明白了再跟大家分享。
作者: ttggl 时间: 2009-5-26 11:45
BizTalk开发系列(三十六) Orchestration单实例执行。
BizTalk 是高效的消息处理引擎,采用多线程并发的方式来处理消息。也就是说当有消息被接收的时候就会产生一个新的消息处理实例。但有时目标系统可能并没有并发处理的能力, 这时就需要在BizTalk中采用单实例的方式来处理消息。在BizTalk的管道中直接可以启用按序送达的方式来实现, 但是在Orchestration中并没有提供类似的选项.该如何做到呢?
其实在BizTalk中可以根据设置消息的CorrelationSet也就是相关属性来实现这样的效果。也就是第一条消息进来之后创建一个Orchestration实例,并且初始化相关集,接下来接收到的消息,如果有相同的相关集的话都会由相同的Orchestration实例来处理而不会创建新的Orchestration实例。
接下来就来实现这样的一个Demo
首先创建Schema,创建完之后新建Orchestration并创建相应的消息。接下来参照下图在Orchestration中画出相应的图形:
绑定相应的消息到Receive, Send形状中,并连接接收与发送形状及端口。本Demo中没有对消息进行转换。只是实现端到端的消息传递而已。
到目前为止整个流程已经基本建完了。不过现在还不能实现之前预想的功能。还需要做下面关键的一步: 创建和设置Correlation
1. 在 Orchestration View的Type类型的Correlation Types里创建CorrelationType.本Demo实现的是以某个Receive Port接收到的消息作标识.此选择CorrelationProperlity属性要选择BTS.ReceivePortName
作者: ttggl 时间: 2009-5-26 11:46 
2. 接着创建Correlation Set. 在Orchestration View的TransferOrch中创建.
3. Correlation Set创建好之后需要做两部分操作一个是初始化.注意在一个Orchestration里面CorrelationSet只能被初始化一次。因此。在本流程中。将Receive_1的Initializing CorrelationSets设置为刚才设置的Correlation Set。
4. 在Receive_2的Following Correlation Sets设置为刚才设置的Correlation Set
至此Singleton Orchestration已经设计好了。给程序集完成程序签名、部署和设置之后来看看实际运行的效果。
接收端口会批量接收消息(当然这里你可以选择按序接收)。第一个消息进行Orchestration之后会先创建Orchestration实例。接下来的消息会使用原有的Orchestration 实例进行处理。当然消息必须是来自于同一个接收端口。这也是之前我们设定的Correlation。
学习开发语言的时候很喜欢输出“Hello World”作为第一个程序。今天我们也在BizTalk 上创建一个简单的 "Hello World" 程序。
BizTalk的时候有很多文章都是教你如何使用Visual Studio开发BizTalk 的第一个应用程序的。今天我们来换一种思路开发基于BizTalk的"Hello World"应用程序。也就是直接通过BizTalk 管理控制台创建应用程序。
BizTalk Server 管理控制台
安装和配置BizTalk之后就可以通过BizTalk控制台管理BizTalk Server 及应用程序。其中有几个概念先了解一下:
BizTalk Group: BizTalk Server 的逻辑概念,可以将多台BizTalk Server加入一个Group进行管理。
Applications: 开发BizTalk应用程序之后它在此节点下。
Platform Setting :BizTalk运行环境的配置比如BizTalk实例(BizTalk运行时的进程),BizTalk适配器等的配置。
查看控制台相关概念
BizTalk 组
BizTalk Group。控制台树中的“BizTalk Group”节点包含表示该 BizTalk 组的项目(应用程序、参与方和平台设置)的其他节点。BizTalk 组是一种组织单位,通常表示企业、部门、中心或需要包含的 BizTalk Server 实现的其他业务单位。BizTalk 组与 BizTalk 管理数据库具有一对一关系。
在 BizTalk Server 管理控制台中选择“BizTalk 组”节点后,BizTalk Server 组中心页将显示在详细信息窗格中。BizTalk Server 组中心页提供 BizTalk Server 系统运行状况的总体概况。
作者: ttggl 时间: 2009-5-25 12:18
应用程序 [隶属于BizTalk Group]
业务流程。业务流程通过使用业务流程设计器进行设计,并部署到 BizTalk 组中。
角色链接。角色链接定义消息定义的角色与双向交互中使用的端口类型之间的关系。
发送端口组。发送端口组是一组指定的发送端口,使用这组发送端口可以在单一配置中将同一条消息发送到多个目标。
发送端口。发送端口是用于发送消息的 BizTalk 对象。
接收端口。接收端口是相似接收位置的逻辑分组。
接收位置。接收位置定义为接收入站文档的特定地址与 BizTalk Server 管道(处理在该地址上接收到的消息)的组合。
策略。策略是业务规则的版本控制**。
架构。架构是消息的结构。一个架构可以包含多个子架构。
映射。映射是定义一个规范中的记录和字段与另一个规范中的记录和字段之间的对应关系的 XML 文件。映射包含一个可扩展样式表语言 (XSL) 样式表,BizTalk Server 可使用该样式表执行该映射中所描述的转换。
管道。管道是一种软件基础结构,用于定义和链接一个或多个处理阶段,并按指定顺序运行这些阶段以完成特定任务。管道将处理过程分为多个阶段,阶段是对一类工作的抽象描述。管道还确定了执行每类工作的顺序。
资源。资源可以是脚本、部署的程序集或与应用程序相关联的其他文件。
BAS 项目。业务活动服务 (BAS) 项目为应用程序提供了一种与外部合作伙伴进行交流的方法。BAS 项目由合作伙伴配置文件(也称作参与方)、合作伙伴组、协议和 Microsoft Office InfoPath 模板组成。必须首先使用 BAS 站点创建 BAS 项目,然后才能将 BAS 项目导入 BizTalk Server 管理控制台并在其中显示。
参与方。参与方是位于 BizTalk Server 之外与业务流程进行交互的实体。与您的组织有业务关系的所有合作伙伴都可视作参与方,而您的组织可能有数千个合作伙伴。
作者: ttggl 时间: 2009-5-25 12:19
平台设置
“平台设置”节点包含主机、主机实例、MessageBox 数据库和适配器等子节点。
主机。“主机”节点包含 BizTalk Server 环境中所有的进程内主机和**主机。BizTalk 主机是诸如适配器处理程序、接收位置(包括管道)和业务流程等项的逻辑容器。。
主机实例。“主机实例”节点包含当前 BizTalk Server 组中的所有主机实例。主机实例是执行应用程序组件的 BizTalk Server 运行时进程。使用“主机实例”节点,可以创建新的主机实例和刷新主机实例信息。
服务器。“服务器”节点列出了加入 BizTalk Server 组的所有服务器。它们是安装和配置 BizTalk Server 以及运行主机实例的计算机。通过将服务器与特定主机相关联可以创建主机实例。
MessageBox。“MessageBox”节点包含当前 BizTalk Server 组使用的所有 MessageBox 数据库。使用“MessageBox”节点,可以创建新的 MessageBox 数据库和刷新 MessageBox 数据库信息。MessageBox 数据库是在执行协作处理的服务器间实现工作项负载平衡的基础。工作项在其整个处理过程中可能会多次通过 MessageBox 数据库。MessageBox 数据库的名称不得超过 100 个字符。
适配器。“适配器”节点包含为 BizTalk Server 组和关联适配器处理程序配置的所有发送和接收适配器的子节点。适配器是用于在终结点之间发送和接收消息的消息传送中间件。
看了这些概念可能还是云里雾里的。不过没关系BizTalk不是那么好理解,特别是刚开始学习的时候。因为它的开发理念和程序语言有点不太一样。它是面向消息的开发理念。之前跟一些学习BizTalk新人聊的时候。常常会听到“我学习BizTalk 一个星期了,还不知道它干嘛用。”。 而后来跟一位BizTalk MVP聊的时候我提到了这一点。他也很搞笑的说“我当时搞了三个月了还不知道是干嘛用的”。所以不要急于求成。
作者: ttggl 时间: 2009-5-25 12:20
开始开发
1. 首先打开BizTalk 服务器管理控制台,在Applications节点右击选择新建->应用程序.在弹出的对话框的名字栏里填上应用程序名称:Hello Word
2. OK,应和程序Hello World已经建了,只不过它什么都干了了。我们会在Hello World节点下看到很多节点。每个应和程序都会有这么多的节点。这些节点都跟BizTalk的架构的关的,暂时先不用了解那么细致。
3. BizTalk像是一个盒子用于处理消息。因为就需要有进入的消息和出来的消息。那样我们首先创建一个接收的端口用于接收消息。
在Receive Port 节点右键->新建->单一方向端口,在常规选项卡里写上端口名称:ReceiveFiles。
4. 端口是BizTalk的逻辑概念,真正接收的地方是在 "Receive Location"节点下配置的。在ReceiveLocations节点下右键->新建->单一方向接收地址.在"选择接收端口"的对话框中选择刚才新建的端口"ReceiveFiles"。
5. 在接收位置的配置页,填上接收位置的名称。在类型中选择File, 接收管道选择PassThruReceive。
6. 点击类型的Config按钮,弹出File的配置对话框配置接收位置,以及相应的文件名称。
作者: ttggl 时间: 2009-5-25 12:20
7. 创建好了接收端口,接下来我们来创建发送端口。发送端口直接指定发送的物理位置和发送方式。多个发送端口使用Send Group进行管理。
右击Send Ports 节点->新建->Static One-Way Send Port
8. 在发送端口配置菜单中参照下图分别配置:发送端口名称,类型,相应类型的发送位置。
9. OK,现在端口已经全部创建完成了。现在是万事俱备只欠东风。现在你会不会有这样一个问题:怎么让接收到的消息由发送端口发送出去?也许你会认为它们同在一个应用程序下面直接就可以实现了。但同一个应用程序下面可以创建许许多多的发送的接收端口那BizTalk怎么去判断消息从哪接收又发送到哪呢?。
呵呵,带着问题,我们来看看可能怎么将接收端口和发送端口关联起来。再次打开发送端口配置对话框,我们会注意到左边的菜单项中有一个叫“Filter”(过滤)。我们就用这个来实现发送端口与接收端口的关联。在条件表达式中设置: BTS.ReceivePortName == ReceiveFiles
10. 启动BizTalk 应用程序验证程序
右击Hello World应用程序选择Start。打开刚才配置的接收文件夹。将测试XML文件 QuickLearn.CN.Msg.XML拷贝到接收文件夹In中。
在Out 文件夹中查看输出
我们的第一个BizTalk 程序已经成功运行了,感觉怎么样。是不是很神奇。虽然很多理论性的东西没有讲到。但是对于初学者来讲往往兴趣更重要。另外这个程序还可以改为用于搬运文件,或者不需要走流程的业务中。它的专业术语叫“直通流程”。我是在学习BizTalk三个月之后才知道这个东西的。记住这个Sample,在以后的BizTalk学习过程中慢慢理解这个Sample以及BizTalk的架构思想。
作者: ttggl 时间: 2009-5-25 12:21
BizTalk开发系列(二) "Hello World" 程序搬运文件。
我们在<QuickLearn BizTalk系列之"Hello World">里讲到了如何快速的开发第一个BizTalk 应用程序。现在我们来讲一下如何把这个程序改成用于搬运文件的程序。
我们的设想是:不管文件的类型是什么,将文件从In 文件夹搬到 Out 文件夹。我们来看看应该怎么实现这个设想。
首先我们会发现"Hello World"程序在接收位置的文件名称是" *.XML".也就是说它只接收XML文件类型的文件。既然它支持通配符的表达式那么我们就可能把这里改为:" * "也就是说让它支持任何类型的文件。(在Windows系统中允许文件没有扩展名,所以我们就用*让它代表所有的文件)
我们的测试数据有三种类型的文件,分别是:XML, ZIP, Gif。现在我们将这三种类型的文件拷贝到In文件夹。再看看输出文件夹:
[输入文件]
[输出文件]
很显然,我们输入的文件都已经被输出到正确的目标下了。也就是说BizTalk成功的路由了消息。但是这跟我们设想的还有点差距。输出的文件中除了XML类型的消息可以被正确访问之外。其他文件需要更改为相应的文件后缀才可以被访问。但我们希望的是输入的文件在输出的时候还能够保持原样(文件名,文件大小,文件类型)。那么我们接下来就要在发送端口做一下改变了。做什么改变呢?我们要让BizTalk输出文件的时候保持原有的文件名和后缀。
打开发送端口的类型配置对话框。我们会发现在文件名的表达式里有一个特别的关键字“%MessageID%”。这个表达式其实是BizTalk的宏,它表示的是这个消息在BizTalk中的ID号 。也就是说在执行的时候它会被真实的值给替换。
现在我们将这个表达式改为: %SourceFileName% . 这个宏的意思是保留原文件名称。
OK,现在我们配置好了。我们来看一下执行的效果。我们发现文件按照原有文件名被输出出来,而且可以被正常访问。
注意事项:本文主要是为了讲如何实现这一需求。在生产环境中使用该方法要考虑更多的因素:
文件大小 对于消息的处理需要对服务器做进一步的调整,目前微软官方已经测试通过了 2G的单文件。
数据库的维护 BizTalk的所有消息都是保存在BizTalk数据库里的所以要做好BizTalk 数据库的管理
系统稳定性 如果处理的文件过大,过多会造成系统的不稳定。
系统性能 不同的适配器性能表现不一样。
来源:www.cnblogs.com/cbcye 作者:地球人
作者: ttggl 时间: 2009-5-25 12:21
BizTalk开发系列(三) 单机环境下的BizTalk Server 2006 R2安装。
大部分的开发环境都是在单机环境下进行的,今天整理了一下BizTalk Server 2006 R2在单机环境下的安装步骤。1. 软件需求
在**服务器中完整安装BizTalk Server 2006 R2的基本软件需求
Windows 2003 Server with Service Pack 2 (SP2), or Windows 2003 Server R2
Microsoft Office Excel 2003 and InfoPath 2003 with Service Pack 2
Microsoft Visual Studio 2005 with Visual C# .NET
Microsoft SQL Server 2005 with Service Pack 2 or Microsoft SQL Server 2000 with Service Pack 4
Microsoft SQL Server 2005 Analysis Services with Service Pack 2 orMicrosoft SQL Server 2000 Analysis Services with Service Pack 4
Microsoft SQL Server 2005 Notification Services with Service Pack 2 orMicrosoft SQL Server 2000 Notification Services 2.0 with Service Pack 1
Business Activity Services (BAS) 需要安装 Microsoft WindowsSharePoint Services 2.0 with Service Pack 2 (WSS SP2) is installed. BAS仅支持 WSS SP2.
Windows SharePoint Services (WSS) 适配器 Web Service需要安装以下组件之一:
Microsoft Windows SharePoint Services 2.0 with Service Pack 2
Windows SharePoint Services 3.0
Microsoft Office SharePoint Server 2007 (MOSS)
安装RFID的软件需求
Microsoft .NET Framework 3.0
Web Services Enhancement (WSE) 3.0
Microsoft Message Queuing service (MSMQ)
Microsoft Management Console (MMC) 3.0 version
2. 安装必备组件
| 步骤/任务 | 注释 |
| 步骤 1: Windows Server 2003 R2 + SP2 | 建议在安装之后新建一个Administrators组的帐户用于BizTalk Server 的运行。 |
| 步骤 2:安装 Internet 信息服务 6.0 | 启用 ASP.NET |
| 步骤 3:安装带 Service Pack 2 的 Office Excel 2003 和 InfoPath 2003 | 使用默认设置进行安装 |
| 步骤 4:安装 Visual Studio 2005 安装 .NET Framework 3.0 / 3.5 | 安装 Microsoft C# 和 Framework SDK |
| 步骤 5:安装 SQL Server 2005 | 使用默认设置进行安装 如果有SQL Server 2005 SP2的话也一并装上。 |
| 步骤 6:安装并配置带 Service Pack 2 的 Windows SharePoint Services 2.0 | 安装类型必须为 Server Farm |
| 步骤 7:将默认网站扩展为虚拟服务器 | 对于安全类型选择 NTLM。业务活动服务不支持 Kerberos 验证。 |
| 步骤 8:为业务活动监视 (BAM) 警报创建网络共享 | 创建名为 Alerts 的共享 授予 Everyone 对此共享的 Change 权限 |
3. WSS安装过程 由于WSS安装完之后还需要扩展站点才能正常安装BAM,Sharepoint Adapter等组件。所以这里讲一下关于WSS和扩展站点的配置。
安装完成之后会链接到WSS配置网站配置WSS的应用程序池和管理数据库。您也可以自己通过点击开始->程序->管理工具->SharepontAdministration打开该站点.下图显示的是新建配置WSS运行池"WSSAppPool",使用Administrator的身份运行。
接下来继续配置WSS的管理数据库。主要是要填上数据库服务器名称和数据库名称。
作者: ttggl 时间: 2009-5-25 12:22 
扩展站点,配置好WSS管理数据库之后在控制台选择扩展或新建站点。在显示的列表中选择要扩展的站点,默认为默认站点。在配置内容数据库页面配置相应的应用程序池和数据库即可。
再次点击新建或扩展Web应用程序刚才的站点已经不在列表中。则表示扩展已经成功。在IIS的默认站点的属性里可以看到在ISAPI菜单下新增加了一个Sharepoint 的ISAPI筛选器。
4. BizTalk Server 2006 R2安装过程
BizTalk 的安装过程比较简单。在点击Setup之后会有服务协议、用户名称等信息需要配置。另外在安装之前最好先将BizTalk所需的CAB包下载好。这样可以大大的加快安装进度。另外还可以方便下重复利用。
组件选择,一般开发机选择所有组件。以适应不同的BizTalk需求。 
5. BizTalk Server 2006 配置
BizTalk Server 2006 R2支持两种配置方式。这两种配置方式是有一定区别的。但对于一般的开发环境只需要采用基本配置即可。这样可以节省很多时间。
基本配置的注意事项
使用基本配置来配置 BizTalk Server 2006 时,请注意以下事项:
不支持配置远程 SQL Server。
支持根据 SQL Server 2000 和 SQL Server 2005 默认实例和命名实例配置 BizTalk Server 2006。
注意
不支持 SQL Server 2000 Analysis Services 的命名实例。在配置过程中,必须使用 SQL Server 2000 Analysis Services 的默认实例。
作者: ttggl 时间: 2009-5-25 12:22
登录所用的帐户必须是本地 Administrators 组的成员,并拥有对 SQL Server 的系统管理员权限。
登录所用的帐户必须为 OLAP 框中的 OLAP Administrators 的成员(如果配置的话)。
不能使用基本配置在 SQL Server 命名实例上配置 BAM 分析。如果您使用的是命名实例,并且希望配置 BAM 分析,则应使用自定义配置管理器。
如果使用 BizTalk Server 管理控制台来管理 BAS 项目,则必须在运行 BAS 网站的计算机上和运行 BizTalkServer 管理控制台的计算机上为 Microsoft 分布式事务处理协调器 (DTC) 启用事务 Internet 协议 (TIP)事务。默认情况下,Windows XP SP2 和 Windows Server 2003 将禁用 TIP 功能;而在 Windows2000 Server 中,安装安全更新 902400 之后会禁用 TIP 功能。若要启用 TIP 功能,请按照http://go.microsoft.com/fwlink/?LinkId=58318 中所述步骤进行操作。
自定义配置
使用自定义配置来配置 BizTalk Server 2006 时,请注意以下事项:
登录所用的帐户必须是本地 Administrators 组的成员,并拥有对 SQL Server 的系统管理员权限。
自定义配置管理器中列出的由 BizTalk Server 生成的默认帐户是本地组。在多服务器环境中,必须用域组替换本地组。
登录所用的帐户必须为 OLAP 计算机中的 OLAP Administrators 组的成员(如果配置的话)。
使用基本配置
运行的帐户必须具有管理员权限,建议新建一个专门用于BizTalk运行的账户。以防管理员密码更改之后BizTalk运行不正常。另外还要注意的是不对BizTalk运行的服务器改名。不对BizTalk运行的用户更改密码。因为这样导致BizTalk 不能正常运行,而且修复也非常麻烦。
在基本配置向导的配置过程中可以会出现有些组件不能正常安装。需要根据相应的错误提示更正错误。
BizTalk 配置向导会在配置完成之后产生配置的报告,可以通过配置向导对失败的组件进行重新配置或安装。
再一次运行配置向导的时候会显示各组件的状态。
全部安装成功,可以还导出配置以便以后管理需要。注意,导出的配置里面不会保存用户密码。在导入的时候需要重新设置用户的密码。
6. 安装之后的验证 
[增加了一些菜单]
作者: ttggl 时间: 2009-5-25 12:22
[BAM站点可以正常访问]
[Visual Studio 新增BizTalk Project模板]
[增加了BizTalk Server数据库]
[BizTalk Server 管理控制台]
作者: ttggl 时间: 2009-5-25 12:23
BizTalk开发系列(四) 深入Map测试。
在BizTalk的开发过程中XML消息间的映射是一个很重要的内容。如果只是一般的从源节点的值复制到目标节点的话,BizTalk项目提供的MAP测试和验证就已经可以满足需求了。但是很多时候需要在映射的过程中进行复杂的处理。比如节点值的组合运算等。幸好VisualStudio提供了对XSLT的测试功能。在BizTalk的开发过程中可以借助此功能做到Map的"单步"调试。下面我们分别看一下Map的简单测试与高级测试。
简单Mapping测试
验证Map
右击选择Validate可以在“输出”窗口,查看到关于Map的验证信息。
测试Map
右击Test map,Visual Studio会自动生成Map 的源消息,在输出窗口查看到关于Map的测试信息。
如果要用自定义的消息做测试实例的话。可以右击选择属性,在属性窗口的TestMap Input Instalce 和 TestMap Output Instance分别输入相应文件的路径。
高级Mapping测试
在实际的开发过程中,经常需要对Map做一些自定义的开发。为此BizTalk 的Map编辑器提供了ScriptFunctoid,支持C#.NET, JScript.NET, Visual Basic.NET, 可扩展样式表语言转换 (XSLT),XSLT调用模板。如果使用“简单测试”的话,调试这些脚本就会很麻烦。因为有时我们需要知道输入参数和输出参数的值,脚本的执行情况等信息。以帮助我们改进脚本。
如果您有做过验证Map的时候,您会发现在输出窗口会提示生成了相应的XSLT文件(注:XSLT是一种转换语言)。VisualStuido可以支持XLST的调试。我们就下面Sample,讲一下如何使用Map生成的XSLT文件去测试Map.(注意:对XSLT文件的修改不会应用到相应的Map文件中)
如下图所示,我们在Map中使用自定义脚本:内联XSLT和C#。
内联XSLT的脚本代码
<xsl:if test="MainRecord/SubRecord/@AttributeA = 'AttriA'">
<FieldB>
<xsl:value-of select="MainRecord/SubRecord/@AttributeA" />
</FieldB>
</xsl:>
内联C#的脚本代码
public string MyConcat(string param)
{
return param.Trim();
}
1.右击Map文件,点击“验证”
2.在输出窗口中按住Ctrl, 点击后缀为 XSL的文件。
3.在打开的文件上右击"查看源码"
4.此时我们可以发现在XSL编辑器的左边可以设置断点,并且菜单上多了一个"XML"菜单。
5.在属性中设置好XSLT的输入和输出文件
6.点击"调试XSLT" 就可以单步调试XSLT,在右边的输出文件窗口还可以实时的看到轮换的效果。
7.在监视栏可以输出变量的信息,运行到Template的时候还可以直接输入Xpath查询语句验证输出。同时鼠标移到选取字段的时候还可以看到当前变量或语句的值。
XSLT中的脚本支持是微软对XSLT语言进行了扩展增加了<msxsl:script>元素,所有自定义脚本生成的时候都会在此节点,如下面的代码。
<msxsl:script language="C#" implements-prefix="userCSharp"><![CDATA[
public string MyConcat(string param1, string param2)
{
return param1+param2;
}
]]></msxsl:script>
有了以上的测试方法我们就可以很方便的找到Map中的Bug,但是对于外部程序集的测试的时候,只能通过"简单测试"的Test Map方法进行,因为Map将对程序集、类和方法的引用放置在与生成的样式表相关联的扩展对象文件中,并在运行时才对其进行调用。因此您可以编写自定义内联Functoid以方便测试。当然开发就麻烦点。
作者: ttggl 时间: 2009-5-25 12:24
BizTalk开发系列(五) 属性字段。
在根据消息内容进行路由的时候经常使用的是可分辨字段和属性字段。属性字段可以在各个 BizTalk Server组件(包括管道和业务流程)中进行访问。属性字段还可用于消息路由。如果需要在上下文(而不是在业务流程)中访问升级的消息数据,必须创建一个或多个属性架构来描述要升级的数据。
消息上下文中的每个属性均由以下三个部分构成:名称、命名空间和值。例如:
<Property Name="InterchangeID"Namespace=http://schemas.microsoft.com/BizTalk/2003/system-propertiesValue="{AC07BF30-2F1A-42B0-8390-191EF38BA839}"/>
现在我们来谈一下属性字段的使用,“属性字段”的方法升级属性需要创建属性架构。所有属性升级作都是通过“升级属性”对话框来完成。您可以通过使用消息架构中 Schema 节点的“升级属性”来访问该对话框。
1.创建属性架构
属性架构是一种与消息架构相关联的特殊架构。它用于将实例消息中的特定值升级到消息上下文中。属性升级提供了一种集中机制,通过该机制,您可以从实例消息中请求所定义的关键信息,并使其可更方便地被负责对通过 BizTalk Server 的消息进行处理的 BizTalk Server 组件访问。
2.升级属性字段
在“升级属性”对话框中,确保已选中对话框右侧的“属性字段”选项卡。然后,确保相应的属性架构已包含在“属性字段”选项卡顶部的“属性架构列表”中。如果需要,请使用文件夹按钮通过“BizTalk 类型选取器”对话框来选择相应的属性架构。
接下来,展开对话框左侧的架构树中的节点选择您要升级为属性字段的“字段元素”节点或“字段属性”节点,然后单击“添加”。最后,使用“属性-字段字典”表的“属性”列中的下拉列表选择属性架构中与升级属性关联的“字段元素”节点。
3.属性字段的使用
设置完属性字段与架构元素或属性之间的关联之后,即可在通过访问消息的上下文属性访问或设置该属性的值。注意消息的架构与升级为属性字段的架构一致。
可以将属性架构中的“记录”节点升级为“字段元素”节点,但只有在“记录”节点的“内容类型”属性设置为 SimpleContent 的情况下才可进行此操作。
在一个架构中,可以对同一属性升级多次,只要所有这些升级都是在不同的根节点下进行即可。这是因为消息是根据单个根节点进行验证的,只有在该根节点下升级的属性才会在运行时进行评估。
升级为属性之后会添加两部分
4.测试属性字段及其在路由中的应用
输入的XML消息
<ns0:Root xmlns:ns0="http://MultiPartMsgTest.Sch_One2">
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
</ns0:Root>
在发送端口的筛选器中使用升级属性,用于路由消息。
在发送商口设定不同的输出文件名
验证消息处理
5.可分辨字段与属性字段的区别
下表概括出了属性字段与可分辨字段之间的区别,可如果需要更灵活的基于内容的路由可以采用属性字段,如果只是关键节点值的读取与赋值的话则可分辨字段比较合适。
| 属性 | 属性字段 | 可分辨字段 |
| IsPromoted 属性 | True | False |
| 大小限制 | 255 个字符 | 无限制 |
| 用于路由 | 是 | 否 |
| 用于跟踪 | 是 | 否 |
| 在业务流程中使用 | 是 | 是 |
| 需要属性架构 | 是 | 否 |
| 可通过管道和端口进行访问 | 是 | 否 |
参考资料《BizTalk Server 2006 Documentation》
作者: ttggl 时间: 2009-5-25 12:25
BizTalk开发系列(六) BizTalk开发简述。
现在很多大型企业信息化程度很高,运行中的系统可达到数十乃至上百个。而大部分系统由于建设的时间、开发团队和技术往往不相同,系统之间的大部分都是**运行的。随着信息化建设的深入各系统之间的交互需求越来越紧迫。但是由于信息化的建设不可能一触而就,也不可能再组建一个团队把所有的系统重构。因此需要一个系统与系统之间交互的中间件。
BizTalk就是这样一个中间件。它本质上是一个消息处理引擎,处理消息验证,映射,业务流程等。以下是BizTalk的运行时高度概括结构,了解其结构可以在更有针对性的开发相关业务。
BizTalk运行时通过适配器能接收端口接收数据创建消息,经接收管道处理比如升级消息里的内容为消息属性复制到消息上下文等。消息经处理管道处理之后将会存储到MessageBox数据库。下一步将决定消息的传送目标,在BizTalk系统中消息可以传给业务流程处理也可直接传往发送端口。不管目标为哪一个,BizTalk都是采用发布订阅机制,每个订阅方都会从BizTalk消息引擎中获得消息的副本。最终消息由发送管道处理之后由发送适配器以相应的格式发送到目标。
BizTalk主要开发内容
消息
BizTalk的消息指的是XMl文件、二进制文件、SOAP消息等所有的格式。但在BizTalk内部唯一使用XML文档。每个消息都可以可以视为一个多部分消息,此类消息可以由一个或零个消息组成。所有消息在BizTalk中都是不可改变的,这就意味着消息在构造之后就不可以再改变(这点在开发过程中很重要)。系统的每个消息都带有一个属性集,包括消息ID,接收端口,实例ID等信息。消息的属性可以通过管理控制台查看。
实际开发过程中主要定义消息的格式,由于BizTalk内部唯一使用XML文档因此主要通过Schema编辑器定义XSD(XML架构定义语言)。建议熟悉XSD定义。
映射
映射由多个底层组件组成,并依赖于已创建的架构。这些架构又依赖于 XML 架构定义 (XSD) 语言。在开发映射过程中如果懂得XSLT语言则会更加方便。
适配器
适配器是一种软件组件,可以使用符合可识别的常用标准的传输机制通过 BizTalk Server 便捷地发送或接收消息:SMTP、POP3、FTP 或 Microsoft 消息队列(MSMQ)。BizTalk Server 2006 包含以下类型的适配器(也称为“本地”或“集成”适配器):基本 EDI、BizTalk消息队列、FILE、FTP、HTTP、MQSeries、MSMQ、POP3、SMTP、SOAP、SQL,以及 WindowsSharepoint Services。
每个本地适配器均关联有一个接收位置,用于在特定地址侦听来自特定传输的消息。在接收位置收到消息后,消息将传递给适配器。适配器将向消息(通常在消息的正文部分)附加数据流,添加有关接收数据的源终结点的所有元数据,然后将消息提交到 BizTalk 消息引擎。
由于BizTalk提供的适配器已基本满足需求,如有特别需求可以参考SDK文档进行开发。
管道
尽管初始消息是由适配器创建的,但对收到消息的处理过程大部分发生在接收管道中。管道处理针对消息内容以及消息上下文。对消息内容的处理通常发生在解码、拆装和验证阶段,而对消息上下文的处理则可发生在所有阶段。
BizTalk提供了比较方便的管道开发方法,通过继承BizTalkSDK提供的接口将消息流接收过来,经过处理之后再返回接口即可。无需涉及事务,大消息等复杂的内容。因此如需对消息进行底层的开发(例如Excel数据流转为拆装器可识别的XML数据流,针对XML消息添加命名空间等操作)大部份是在管道中进行。
业务流程
业务流程是用于表示可执行的业务程序的灵活且功能强大的工具。您可以在直观可视化绘图中设计流、解释和生成数据、调用自定义代码以及进行所有处理。
消息、作用于消息的发送和接收操作以及传输消息的端口都是业务流程的基本元素。消息是业务流程与外界进行通信以及实施电子商务的媒介。
业务流程不但跟实际的需求关系紧密而且需要了解的技术也比较多。主要有以下几个需要了解的技术:事务,相关集,多部分消息,类型(端口,多部分消息)。还有应熟悉业务流程设计器提供的各种形状,这些形状表示了业务流程的逻辑流。
作者: ttggl 时间: 2009-5-25 12:26
BizTalk开发系列(七) Hello World2。
之前根据BizTalk的订阅原理,使用BizTalk管理控制台创建了第一个应用程序 HelloWorld。但是由于控制台的开发功能有限,绝大多数的BizTalk程序都是在集成开发环境VisualStudio下进行的。下面我们在Visual Studio下创建HelloWorld2程序。其功能是将源消息的两个字段组成第三个字段并保存到目标消息。[效果图如下]

此程序主要是为要熟悉BizTalk相关的开发组件包括:Schema, Mapping , Pipeline, Orchestration的开发。Receive/Send Port的配置等。以下是开发的一些步骤:
1.创建应用程序
打开Visual Stuido,依次点击 文件->新建->项目. 在程序名称和路径中填上相应的名称和路径。点击确定创建应用程序
2.创建架构(Schema)
右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Schema文件,在右侧的模板中选择Schema.在名称中选择输入Schema的名称。
在打开的Schema编辑器中右击Root.依次点击 Insert Schema Node->Child Field Element.

作者: ttggl 时间: 2009-5-25 12:26
依次创建两个子元素,并命名为:para1和para2(元素默认为字符串值)。Schema命名空间按默认值。
按以上方法创建目标Schema.文件名为:TargetSchema.架构视图如下:
2. 创建映射(Map)
右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Map 文件,在右侧的模板中选择Map.在名称中选择输入Map的名称。
在打开的编辑器的左侧窗口中点击 Open Source Schema在打开的对话框中选择BTSHelloWorld2.SourceSchema.在右侧窗口点击Open Destination Schema.在打开的对话框中选择BTSHelloWorld2.TargetSchema.
打开源与目标架构之后,依下图连接源与目标节点。目标架构的string节点是由para1和para2连接而。在map编辑的工具窗口选择String Concatenate Functoid.
3.创建业务流程(Orchestration)
作者: ttggl 时间: 2009-5-25 12:27
3.1 如前所述。右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Orchestration 文件,在右侧的模板中选择Orchestration.在名称中选择输入Orchestration的名称。
3.2 创建消息。打开Orchestration文件,在OrchestrationView窗口中新建两个消息分别为:SourchMsg和TrgetMsg。其类型分别为:BTSHelloWorld2.SourceShema和BTSHelloWorld2.TargetSchema。如果当前编辑环境中没有OrchestrationView可以在View->Other Windows->Orchestration View中打开视图
3.3 创建和配置业务流程
如图中所示为已经配置完成的流程图形状,实现此流程需要做以下几步。
从工具栏中选择Receive , Transform , Send 三个形状以图中所示位置排列好。
在Receive形状的属性窗口的消息属性中选择刚才创建的SourceMsg。双击Transform在弹出的窗口中选择已存在映射并 在下拉框中选择BTSHelloWorld.StringMap.在Source和Destination中分别选择SourceMsg和TargetMsg。在Send 形状的属性窗口的消息属性中选择刚才创建的TargetMsg
在Receive形状的属性窗口的Active属性选择True.表示活动端口以激活业务流程实例
创建接收端口:从工具栏中选择Port形状,拖放到左侧Port Surface中.在端口配置向导中按照提示分别输入:端口名称,端口类型,“从此端口接收消息”“稍后配置”。
作者: ttggl 时间: 2009-5-25 12:27
创建发送端口:从工具栏中选择Port形状,拖放到右侧Port Surface中.在端口配置向导中按照提示分别输入:端口名称,端口类型,“从此端口发送消息”“稍后配置”。 
4 创建接收的发送管道(Pipeline)
4.1 接收管道(Receive Pipeline)
如前所述。右击BizTalk项目,依次点击 添加->新建项. 在弹出的对话框中的左侧导航栏中选择Pipeline文件,在右侧的模板中选择Receive Pipeline.在名称中选择输入Pipeline的名称。
打开Receive Pipeline 从工具箱中选择XML disassembler组件,拖放到Disassemble阶段。
4.2 发送管道(Send Pipeline)
发送管道的创建方法和接收管道类似,只是在选择模板时选择发送管道。在Pipeline编辑器中选择 XML Assemble组件拖放到Assemble阶段。如下图所示:
5. 部署BizTalk项目
至此BizTalk的项目开发到这里就基本上完成了。可以生成项目文件看有没有错误信息。接下来需要将BizTalk项目部署到BizTalk主机中。由于BizTalk的程序集需要安装到GAC(全局应用程序缓存)中。所以需要给程序集添加签名。方法是在Visual studio的命名窗口中输入如下命令:
作者: ttggl 时间: 2009-5-25 12:28
sn -k e:projectsbtshelloworld2btshelloworld2.snk
创建应用程序签名之后。在BizTalk应用程序的属性页的Assembly Key File里引用签名。
在配置属性的Build窗口里填上应用程序的名称,并验证服务器是否为本机。从别的机器上拷贝的程序需要注意这一点。
养成良好的习惯,配置解决方案的配置将程序的部署选择上。这对于较大的BizTalk开发有帮助。通过解决方案部署Visual Studio会判断程序之间的关系先后部署。
配置完之后右击解决方案。选择部署解决方案即可。
6. 配置和启动应用程序。
应用程序部署完之后,就可以在BizTalk管理控制台上看到相应的程序。右击该程序,选择配置。在配置应用程序页中分别为程序配置主机,接收端口和发送端口。
6.1 创建接收端口
由于接收端口稍微复杂一点。所以我们以创建接收端口为例。发送端口可参照接收端口的做法创建。首先在应用程序配置页的接收物理端口的下拉框中选择新建接收端口。在弹出的对话框中输入接收端口名称。在左边的导航栏中选择接收位置。在接收位置对话框中输入名称。接收管道选择自定义的接收管道名称(发送端口则选择自定义发送管道名称)类型选择FILE. 点击Config。在弹出的FILE传输对话框中输入接收位置。
作者: ttggl 时间: 2009-5-25 12:28
配置向导会显示相应完成的部分。都配置好之后,点击确定即可。
6.2 启动应用程序
右击应用程序点击启动。在弹出的对话框中再次点击启动。
7. 测试程序
BizTalk程序部署完成了。那下一步就是需要测试程序。测试程序需要源数据,这个源数据不需要我们手动创建。我们可以借助Schema编辑器的生成实例功能生成源数据。右击SourceSchema.选择Generate Instance
在Visual Studio的输出窗口中可以查看到生成文件的地址,打开文件并更改相应的内容。(如果想指定输出文件的路径。可以右击SourceSchema选择属性在对话框中的输出文件里填上文件的路径即可。)
<ns0:Root xmlns:ns0="http://BTSHelloWorld2.SourceSchema">
<para1>Hello </para1>
<para2> World!</para2>
</ns0:Root>
在配置的输出位置我们可以看到相应的输出文件。
8.总结
至此我们完成了整个程序的开发。此Sample涵盖了Schema, Map, Pipeline, Orchestration的开发。BizTalk应用程序的部署及配置等。希望以此都够让你对BizTalk的开发有个大概的了解。
作者: ttggl 时间: 2009-5-25 12:29
BizTalk开发系列(八) BizTalk Server 常识整理。
1.什么是BizTalk Server?
BizTalk 是业务流程管理服务器,用于连接人员,流程,有效管理和提升业务所需的信息。在原有版本业务
流程管理和SOA/ESB 的基础上,第5 个版本,BizTalk Server 2006 R2 帮助组织机构进一步扩展核心流程
管理技术。
2. BizTalk Server 2006 R2 有哪些新功能?
BizTalk Server 2006 R2 包含的新特性,解决主要垂直企业,如制造业和零售业的核心竞争力问题。这些功能包括
对电子数据交换(Electronic Data Interchange ,EDI)和AS2 以及 RFID 的支持。BizTalk Server 2006 R2 能够
与Microsoft Office 2007 系统和 Windows Vista®, 包括关键的 .NET 框架技术如Windows Workflow Foundation
和 Windows Communication Foundation 等相兼容。
如需BizTalk Server 20006 R2 功能相关的详细信息,请参见BizTalk Server 2006 R2 Key Capabilities 。
3.使用BizTalk Server 有什么好处?
扩展-达到每个边界的供应链
BizTalk Server 2006 R2 帮助组织机构有效的管理它们从工厂到店面的供应链。端到端的集成供应链允许组
织机构能够通过关键业务流程的可见度以及与商务伙伴的紧密协作来获得最大的效率。有了新性能如“对
EDI 和RFID 的全面支持”,BizTalk Server 2006 R2 使组织机构具备了最大化数据的采集面,以使业务流程
和商务伙伴实时可见的能力。
连接-统一平台的SOA 与互操作
BizTalk Server 2006 R2 为连接当前的应用程序(不考虑平台)和新的服务提供基础体系结构。这就使您能
够从投资中得到最大限度的回报,并最小化集成所需的技术而带来的成本。因为BizTalk Server 包含连接私
作者: ttggl 时间: 2009-5-25 12:30
有和标准系统的工具,并且与.NET 框架进行了预集成,所以BizTalk Server 是任何SOA 策略的核心。
另外,大量的技术和应用程序适配器可以用于BizTalk Server。由于对从传输协议如FTP, SOAP 和
MQSeries,到与商务应用程序如PeopleSoft, SAP, 和Siebel 的高层集成都能够提供即开即用的支持,您
只需选择需要与应用程序、平台或人员进行怎样的连接,我们就可以提供完成的工具。
• 商务应用程序适配器
• 基于WS-*标准
• .NET 框架(WCF, Windows SharePoint® Services, SQL Server™, Microsoft Dynamics™)
• 大型机和中等系统
• XML 和Web 服务协议(如SOAP)
• 设备(RFID)
交付-经过证明的企业级解决方案
BizTalk Server 是部署最广泛的业务流程服务器,接受来自各种规模的企业和行业关键任务流程的委托。
BizTalk Server 2006 R2 企业版为负载平衡提供内置支持,从而帮助企业对于企业内关键任务解决方案的交
付能力达到7*24 的级别。BizTalk Server 具有容错能力,可以部署易于配置和管理的SQL Server 群集来
保证没有单点失败。另外,由于具有一流的建立和配置能力以及对BizTalk Server 2006 核心框架的保留,
BizTalk Server 2006 R2 为当前BizTalk Server 2004 和 2006 的客户提供无缝的升级方式。无论您企业的
规模有多大,您都需要一流的体系架构。BizTalk Server 2006 R2 正可为您提供企业级的体系框架。
速览:
• 全世界超过7,000 客户
• Fortune100 的90%的企业使用BizTalk Server
• 在2007 Gartner 应用程序基础框架和后端应用程序集成的Magic Quadrants 评级领先者
作者: ttggl 时间: 2009-5-25 12:30
• 在2007 应用程序服务器平台:传统Web ,传统SOA 和**SOA 的Forrester Waves 市场调查中处 于领先
• 世界15 大零售商中有12 家采用BizTalk Server
4. 微软将如何利用BizTalk Server 进行下一步的发展?
BizTalk Server 是XML 和 Web Services 相关的最早产品之一。我们将继续利用新涌现的技术通过自动化
和管理业务流程来降低相关成本。我们将会致力于软件的开发,通过为用户提交软件产品来协调企业的业务
应用程序,人员和其商务伙伴,从而对其建立业务的方式进行革新。
5. 我如何在Windows Workflow Foundation 和 BizTalk Server for workflow 之间选择?
首先,Windows Workflow Foundation 和 BizTalk Server 都能提供对工作流的管理。在决定使用哪种技
术时,问题不是“一个对另一个的比较”,而是关于“根据我已有的和未来所需要的,如何才能让当前已建立
的工作发挥最大的优势”。我们的建议是充分考虑您所需要的工作流类型-例如,它是在一个应用程序内部,
还是应用程序之间或是企业之间。在这种情况下,您会发现您同时使用Windows Workflow Foundation 和
BizTalk Server 来解决问题。
6.BizTalk Server 2006 R2 版本
分支机构版(新)-该版本与企业版共同提供一个真正的“星型结构”的场景;分支机构版将帮助企业为智能
数据和流程共享建立新的局域网内的企业和部门的连接。
企业版-该版本针对企业客户和大型组织,它们寻求先进的具有无限扩展能力的BPM 和 SOA 平台。该版
本现在包括BizTalk 适配器和加速器,主机集成服务器(Host Integration Server ,HIS)), RFID 和 EDI。
标准版-该版本为中型企业或部门提供全面的BPM 和 SOA 解决方案,它也包括BizTalk 适配器和加速器,
HIS , RFID 和 EDI
开发版-仅限于设计、开发和测试解决方案,该版本为预生产环境的应用程序开发提供解决方案。
7.BizTalk Server 支持什么平台?
回答 Windows 2000, Windows XP Professional, Windows Server 2003, SQL Server 2000, SQL Server 2005,
Visual Studio 2005, .NET Framework 2.0。另外,BizTalk Server 对64 位提供运行时支持。BizTalk Server
也支持与非微软平台的互操作。通过它强壮的适配器框架,BizTalk 可以迅速的与专用系统连接。
8.BizTalk Server 如何与 Office System 产品如SharePoint 和 InfoPath 等共同工作?
在与InfoPath 相结合时,开发人员可以设计包括基于表单信息的结构化的工作流。BizTalk Server 能够对
InfoPath 提供支持,使用户可以:
• 通过web services 向 BizTalk Server 提交 InfoPath 文档
• 通过SharePoint Form Libraries 提交或接收 InfoPath 文档
• 操作InfoPath 表单内容建立新的表单
• 更新BizTalk Server 中现有表单信息
利用BizTalk Server 2006 R2,客户可以进入SharePoint Portal Server 来共享BAM 报告,管理业务伙伴
关系,在特定的业务流程自动化场景中增强人机工作流能力。
作者: ttggl 时间: 2009-5-25 12:32
BizTalk开发系列(九) MAP的连接方法。
BizTalk中的Map编辑器可以在源架构和目标架构创建连接。有三种创建连接的方式:
1.普通的连接方式,将左边的记录拖到右边。
2.根据结构自动连接,点击MAP的网格,在属性中选择结构(Structure)。
在将左边记录拖到右边时按SHIFT键。则该记录下的元素而会自动连接
3.根据节点名称自动连接,方法跟结构连接一样。只是在选择自动连接时选择 节点名称。
作者: ttggl 时间: 2009-5-25 12:32
BizTalk开发系列(十) ESB Guidance安装笔记
ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架。详细信息访问ESB指导工具包社区网站 。源码下载
ESB Guidance的安装过程非常复杂牵涉到的问题也是很多方面的。我也是装了数次之后才能成功。以下是安装时的笔记,安装时主要参照ESB Guidance的帮助文档,如果遇到问题可以查此笔记。
1. 安装UDDI不能选择SSL
2. DundasChart 组件运行问题(安装ESB Management Portal需要安装此组件才能显示统计图片)
The current trust level does not allow use of the 'compilerOptions' attribute.
Session state can only be used when enableSessionState is set to true,either in a configuration file or in the Page directive. Please alsomake sure that System.Web.SessionStateModule or a custom session statemodule is included in the<configuration><system.web><httpModules> section inthe application configuration.
解决办法:设置Web.Config, 在<System.Web>和</System.Web>之间加如下代码:
<!--From Windows Support Center-->
<trust level="Full" originUrl="" />
<httpModules>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
</httpModules>
<!-- Enable session state for all the pages in the Web application. -->
<pages enableSessi enableViewState="true"
作者: ttggl 时间: 2009-5-25 12:33
enableViewStateMac="true" validateRequest="false" />
3. Sharepoint报错
解决办法:去除SharePoint扩展站点的ISAPI筛选组件
4. 安装Microsoft.Practices.ESB.CORE.msi
BTSTask.exe ImportApp -Package:"C:Program FilesMicrosoft ESB Guidance1.0 - November 2007Microsoft.Practices.ESB.CORE.msi"/Environment:DEV_CORE /ApplicationName:Microsoft.Practices.ESB
msiexec.exe /q /i "C:Program FilesMicrosoft ESB Guidance 1.0 - November 2007Microsoft.Practices.ESB.CORE.msi"
重新所有BizTalk服务
5. 安装Microsoft.Practices.ESB.ExceptionHandling.msi
BTSTask.exe ImportApp -Package:"C:Program FilesMicrosoft ESB Guidance1.0 - November 2007Microsoft.Practices.ESB.ExceptionHandling.msi"/Environment:DEV_EXC /
ApplicationName:Microsoft.Practices.ESB
6. error " Incorrect syntax near ')' "
Go to "My Settings" on the portal and select an application.
7. Installed ESB Exception Notification
XsltPath. Point this setting to the folder containing the ESB PortalAlert Service (located by default within the %Program Files%MicrosoftESB Guidance Exception Notification Service 1.0 - November 2007folder).
作者: ttggl 时间: 2009-5-25 12:33
Enable Alert Queue Service. This setting indicates if the alertservice should run and check for new exceptions occurring that matchexisting alerts.
Alert Queue Polling Interval. This settingis the number of milliseconds for the alert service to wait betweenprocessing batches of alerts.
Alert Queue Batch Size. Thissetting is the number of exceptions that the alert service shouldprocess as one operation and match against existing exceptions.
Alert Queue Active Directory Cache Interval. This setting is theinterval at which the alert service should refresh its cache of ActiveDirectory information, including e-mail addresses and groupmemberships.
LdapRoot. This setting is the LDAP connectionstring for your domain controller; for example,LDAP://servername.domain.com/DC=domain, DC=com.
Enable AlertEmail Service. This setting indicates if the alert service should sendalert e-mail messages. If you disable this option, the service willstill process exceptions and store alerts in an outgoing e-mail queuetable. You may prefer to use this scenario if you implement analternative e-mail delivery service.
Email Server. This setting is the name of your e-mail server; for example, mail.domain.com.
Sender. This setting is the "From" e-mail address to use in alert e-mail messages.
Email Service Polling Interval. This setting is the number ofmilliseconds the e-mail service waits between sending each batch ofe-mail messages.
作者: ttggl 时间: 2009-5-25 12:34
Email Service Batch Size. This setting is the number of e-mail messages the e-mail service should process in a batch.
8. Installed ESB UDDI Publishing
9. Install the Sample Business Rules Engine Policies and Vocabularies
BTSTask.exe ImportApp -Package:"C
rogram FilesMicrosoft ESB Guidance1.0 - November 2007GlobalBank.ESB.Policies.msi"/ApplicationName:GlobalBank.ESB
10. Error 194008: An error occurred reading the, ESBProcessor/Resolver, Section in the config file
Check the Biztalk and Machine.config
11. IIS 要支持Keribors 认证
· 查看当前认证
cscript adsutil.vbs get w3svc/WebSite/root/NTAuthenticationProviders
· 设置认证方式
cscript adsutil.vbs set w3svc/WebSite/root/NTAuthenticationProviders "Negotiate,NTLM"
12. The Microsoft.BizTalk.ESB binding files are configured to workwith the default BizTalkServerApplication andBizTalkServerIsolatedHost, which are in turn configured to execute inuntrusted mode. If you have changed your host to run in trusted mode,the binding file will not import. To correct this, you must eitherchange the trust level to untrusted or edit the binding file to suityour environment.
作者: ttggl 时间: 2009-5-25 12:35
BizTalk开发系列(十一) 在Orchestration中执行Pipeline。
由于开发需要有时要在流程中执行Pipeline。比如从DB的某个字段中取消息的字符串并在流程中构造消息。该需要通过pipeline进行升级属性字段,验证消息等处理。BizTalk架构已经开放了此接口: XLANGPipelineManage类,以下为在流程中使用接收和发送端口示例。需在项目中引用Microsoft.XLANGs.Pipeline组件(C:Program FilesMicrosoft BizTalk Server 2006Microsoft.XLANGs.Pipeline.dll)
1.使用接收管道
在XLANGPipelineManage类中调用ExecuteReceivePipeline()执行接收管道。
XLangPipelineMangae类中的方法代码:
publicstaticReceivePipelineOutputMessagesExecuteReceivePipeline(TypereceivePipelineType,XLANGMessageinMsg);
在流程中新建一个变量 vRecOut 类型为:ReceivePipelineOutputMessages
新建一个消息 SchMsg 类型为定义的Schema
在构造消息表达式的值为:
vRecOut=Microsoft.XLANGs.Pipeline.XLANGPipelineManager.
ExecuteReceivePipeline(typeof(TestPipelines.MyRecPipeline),InputMsg);
SchMsg=null;//初始化输出消息。
vRecOut.MoveNext();//IElement的默认方法。
vRecOut.GetCurrent(SchMsg);
TestPipelines.MyRecPipeline 为管道的Fully Qualified Name(完全限定名称),包括命名空间和类名。
InputMsg 为输入的消息,也就是要传到管道处理的消息。
2.使用发送管道
调用ExecuteSendPipeline()执行发送管道。
XLangPipelineMangae类中的方法代码:
publicstaticvoidExecuteSendPipeline(TypesendPipelineType,SendPipelineInputMessagesinMessages,XLANGMessageoutXLANGMsg);
在流程中新建一个变量 vInMsgs 类型为SendPipelineInputMessages
新建一个消息 SendMsg 类型为Send Pipeline处理之后的消息。
在构造消息的表达式的值为:
vInMsgs.Add(InputMsg);
SendMsg=null;
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(TestPipelines.MySendPipeline),vInMsgs,SendMsg);
TestPipelines.MySendPipeline为管道的Fully Qualified Name(完全限定名称),包括命名空间和类名。
InputMsg 为输入的消息,也就是要传到管道处理的消息
注意:构造消息需要在构造形状里执行,并且在构造形状的属性里选择要构造的消息否则会报如下错误
Illegal attempt to update the value of part 'part' in XLANG/s message 'InputMsg' after the message construction was complete
作者: ttggl 时间: 2009-5-25 12:36
BizTalk开发系列(十二) Schema设计之Group与Order。
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档。因此消息的格式为XML Schema(XML Schema用于描述 XML 文档的结构)。虽然BizTalk提供了对于XML消息的验证功能。但是往往在BizTalkSchema设计器设计Schema的时候对于Group的用途不是很在意。今天我们来了解一下它的作用,希望对于设计灵活的Schema有点帮助。
首先,我们来了解一下Group的概念,在W3C的定义中. Group是用于定义在复杂类型定义中使用的元素组。BizTalk定义的Schema当然也是符合W3C规范的.但是Group概念跟W3C规定的稍微有点区别的:除了AttriubteGroup(元素组)之外通过BizTalk Schema设计的Group不会真正创建组,即在Schema文件中不会出现GroupName。而是通过相应的Order指示器定义一个复杂类型。我们以下讲的Group都是通过BizTalk Schema设计器定义的Group.
从Schema设计器中可以得到以下几种类型的Group:
1. Sequence 规定子元素必须按照特定的顺序出现
2. Choice 指示器规定可出现某个子元素或者可出现另外一个子元素(可理解为单选)
3. All 子元素能够以任意顺序出现,每个子元素可出现零次或一次。
4. Attriubte 属性组
Group 示例
打开VisualStudio创建一个BizTalk项目并且新建一个Schema文件。在Schema文件上右击属性在输入输出属性中输入同一个文件的路径。在接下来的测试中可以直接通过右击Schema选择生成实例和验证实例这两项目来测试效果。
Sequence Group
作者: ttggl 时间: 2009-5-25 12:37
在Root节点中新建一个Record(记录)节点,名为SequenceRecord。在该节点新建Sequence Group. 在Group下创建三个Element(元素)。如下图所示
生成Schema的XML实例,打开源码可得到如下的XML内容。
<ns0:Root xmlns:ns0="http://schemasample.schema1"/>
<SequenceRecord>
<First>First_0</First>
<Second>Second_0</Second>
<Third>Third_0</Third>
</SequenceRecord>
</ns0:Root>
验证Schema实例可以输出窗口看到成功通过验证的消息。这时更改节点的位置.将Third节点移到First节点之前,保存文件。再次验证Schema实例。可以在输出窗口看到如下消息:
E
rojectsSchemaSampleMsgsSchema1.xml: error BEC2004: The element'SequenceRecord' has invalid child element 'Third'. List of possibleelements expected: 'First'.
Choice Group
在Root节点中新建一个Record(记录)节点,名为ChoiceRecord。在该节点下新建Choice Group. 在Group下创建两个Element(元素)。如下图所示
生成Schema的XML实例.打开源码可得到如下XML内容(节选)
<ChoiceRecord>
<Female>Female_0</Female>
作者: ttggl 时间: 2009-5-25 12:37
</ChoiceRecord>
验证Schema实例可以输出窗口看到成功通过验证的消息。这时在ChoiceRecord节点下添加如下内容:
<Male>Male_0</Male>
保存文件,再次验证Schema实例。在输出窗口得到如下内容:
E:ProjectsSchemaSampleMsgsSchema1.xml: error BEC2004: The element 'ChoiceRecord' has invalid child element 'Male'.
这时可去掉Female节点,再次验证。在输出窗口亦可看到验证成功的消息。
Attriubte Group
在Root节点中新建一个Record(记录)节点,名为AttributeGroup。在该节点下新建Attribute Group. 在Group下创建两个Attribute(属性)。如下图所示 
设计器只允许在Attribute Group下面创建Attribute字段。
生成Schema的XML实例可得到如下内容(节选)
<AttributeRecord Attribute_1="Attribute_1_0" Attribute_2="Attribute_2_1"/>
总结
通过以上的Sample了解了BizTalkGroup的类别及作用。Sequence,Choice,All类型是W3C中定义的Order指示器(Order指示器用于定义元素的顺序),但不知为何ALl Group一直是灰色的。所以本实例就没有对All类型进行测试。另外还可能通过直接定义Record的Group Order Type属性直接指定整个记录的排序类别(如下图所示)。
作者: ttggl 时间: 2009-5-25 12:39
BizTalk开发系列(十三) Schema设计之值约束。
XML Schema 的作用是定义 XML 文档的合法构建模块。在开发过程中有时需要对XML文档做精确的约束。以保证XMl数据的准确性。
今天我们以一个班级Sample来讲探讨一下如何在开发BizTalk Schema过程中对XML数据做精确的约束。这个Schema定义了一个班级,班级下面有成员,成员下面有Name属性,Mobile,City,Result,Comment等字段。
依据以上场景我们对不同的属性或无素做如下需求分析:
| 字段 | 类型 | 作用 | 基类 | 约束 |
| Name | 属性 | 名称 | string | 2-4个字符 |
| Mobile | 元素 | 手机号 | string | 11个数字字符 |
| City | 元素 | 城市 | string | 列表:Beijing, Chengdu, Shenzhen |
| Result | 元素 | 成绩 | int | 数字列表,以空格隔开各成绩值。 |
| Comment | 元素 | 评论 | int/string | 数字或字符串型 |
如上图所示,创建相应的Schema文件。依据需求分析设置相应的字段的属性值。但在这之前我们先来了解一下相应的概念。在Schema约束是使用派生类来指定相应的字段从哪个或哪些基类派生出来的值类型。对于字段或属性的派生类型有以下四种选项:
1. Default 不从任何类型中派生。
2. Restriction 从简单类型中派生出新的受限制的数据类型
3. List 单个简单类型的**(可理解为数组)
4. Union 多个简单类型的**
看了以上的概念大概了解一下这几种设置的区别,现面我们来看一下为相应的字段设置属性值。首先我们打开Name属性字段的属性窗口。如下图所示。在Advanced类别的DerivedBy值下拉框里有四个选项。由于Name属性字段的约束为2-4个字符。因此设置值为Restriction(限制).并在Restriction(限制)类别中分别设置Maximum Length和Minimum Length的值为4和2。
由于Mobile为数字型的字符串而且有长度的限制。如果单单像Name属性那样设置不能达到约束目的。W3C的Schema规范中提供了模式约束(pattern constraint)。在Mobile字段的属性窗口设置Derived By属性值为 Restriction在Restriction(限制)类别下的Pattern属性则是可以输入约束语句(支持正则表达式)。我们可以在打开的编辑窗口中输入:[0-9]{11} 正则表达式语句限制字符串由11个0-9数字组成。
作者: ttggl 时间: 2009-5-25 12:39
City的值是要由列表限制的。Schema规范也提供了枚举约束(enumerationconstraint)模式。在City字段的属性窗口设置Derived By属性值为Restriction。在Restriction(限制)类别下的Enumeration属性编辑窗口输入如下图所示的值。
Result其实是一个数值类型的数组。如下图所示设置Derived By属性值为List。设置Item Type值为xs:int。
Comment 评论字段由于不确定得到的值是字符串类型的还是数值类型的(有可能得到一段评语也有可能得到一个分值)。因此是一个复合型的字段。
通过以上的设置已经完成了Schema的定义过程。会在Schema Soruce窗口得到如下代码:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemasample.limit%22/%5C%22]http://schemasample.limit"/[/url] targetNamespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemasample.limit%22/%5C%22]http://schemasample.limit"/[/url] xmlns:xs="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/2001/XMLSchema%5C%22]http://www.w3.org/2001/XMLSchema[/url]">
<xs:element name="Class">
<xs:complexType>
<xs:sequence>
<xs:element name="Member">
<xs:complexType>
<xs:sequence>
<xs:element name="Mobile">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="11" />
<xs:pattern value="[0-9]{11}" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="City">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Beijng" />
<xs:enumeration value="Chengdu" />
<xs:enumeration value="Shenzhen" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Result">
<xs:simpleType>
<xs:list itemType="xs:int" />
</xs:simpleType>
</xs:element>
<xs:element name="Comment">
<xs:simpleType>
<xs:union memberTypes="xs:int xs:string" />
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="4" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
作者: ttggl 时间: 2009-5-25 12:39
测试
测试Scheam可能在Shema文件的属性中直接设置同一个输出与输入文件路径方便测试。有一点需要注意的是设置了相关约束之后通过Schema的生成实例选项生成出来的XML文件并不一定是符合约束条件的,特别是对于模式约束(pattern constraint。这一点在BizTalk的帮助文件里已经提到了这是一个已经的问题。
但不管怎么样直接生成实例是最简单的方式。通过直接生成实例我们得到了以下的XML数据:
<ns0:Class xmlns:ns0="http://schemasample.limit"/>
<Member Name="Nam">
<Mobile>MobileMobil</Mobile>
<City>Beijng</City>
<Result>10</Result>
<Comment>10</Comment>
</Member>
</ns0:Class>
直接验证实例不能成功。提示Mobile不符合规范。我们修改XML数据如下:
<ns0:Class xmlns:ns0="http://schemasample.limit"/>
<Member Name="Nam">
<Mobile>13800138000</Mobile>
<City>Beijng</City>
<Result>90 95 97 99</Result>
<Comment>Good!</Comment>
</Member>
</ns0:Class>
再次验证实例可以通过验证。虽然通过了测试不过请对比上下两个XML数据,以理解不同模式的区别。红色加粗部分为整数型的成绩字段数组。在Schema 声明的时候使用List模式。该模式是使用空格分隔不同值,因些需注意在List模式下使用string类型的时候要注意内容是否有空格。
粉色加粗部分是复合类型。上一个XML数据使用了整合类型通过验证。下一个使用字符串类型也同样通过验证。
作者: ttggl 时间: 2009-5-25 12:52
BizTalk开发系列(十四) XML空白字符(WhiteSpace)。
最近在做一个BizTalk项目,对XML文件的处理很复杂。本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格。但是找了很久没有看到相关的方法。如果有知道该方法的麻烦跟我讲一下:cbcye@live.com不过下面我整理了一下与之相关的XML空白字符(WhiteSpace)。
先来看看这个问题比较一下这两个XML是否一样?
XML(一)
<AddBook>
<Name/>
<Mobile/>
</AddBook>
XML(二)
<AddBook><Name/><Mobile/></AddBook>
如果你觉得一样的话,那么我们来进行如下。我们使用的是XSLT(XML转换语言)读取整个XML文档。此XSLT文件的作用是拷贝整个源XML文档中的节点到目标XML文件中。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/1999/XSL/Transform%5C%22]http://www.w3.org/1999/XSL/Transform[/url]">
<xsl
utput method="xml" indent="yes"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet> 测试时在Visual Studio的XSLT调试界面设置断点。在监视窗口使用Xpath函数:node()来查看XML文档中的节点变化情况。
XML(一)的节点:
作者: ttggl 时间: 2009-5-25 12:53
XML(二)的节点:
从以上的测试数据可以看出当XML处于不同行的时候XML会多一些类型为whitespace的节点。由此可见XML(一)与XML(二)是不相同的。那为什么它们之间不相同呢?那为什么我们使用IE之类的XML解析器打开两个文件的话看到的效果是一样的?当然我们这里不讨论IE之类的是如何处理的(事实上是我也不知道IE是如何处理的:)。我们主要来看看这两个XML之间为什么不一样。也就是本文要涉及的Whitespace。
首先我们来了解一下在XML里什么叫WiteSpace。XML 将以下四种字符归为空白字符:回车符(r 或 ch(13))、换行符(n 或 ch(10))、制表符 (t) 以及空格 (' ')。在 XML 文档中,空白字符分为两类:
有意义空白字符 是文档内容的一部分,应予以保留。
无意义空白字符 在编辑 XML 文档时使用,以增加可读性。这些空白字符一般在文档交付时不予保留。
由此可见XML文档有时根据处理需要会增加一些回车、换行之类的特殊字符。但是如果这些字符在处理XML时不先清除(如果有必要的话)。那么就会造成一些错误。比如在XSLT文件中有如下表达式的话那么XML文件中的空白字符就有可能引用转换处理错误。因为空白字符是不能作为节点名称的。
<xsl:elementname="{local-name()}">
了解了XML文件中有无空白字符的区别与XML文件中空白字符的用处之后我们来了解一下XML处理器是如果处理空白字符的。该如何根据需要处理空白字符。
XML 分析:XML 规范提供了一个内置属性 xml:space 来告知 XML分析器其是否应忽略空白字符。该属性由其根元素的子元素来继承。声明时,必须将其指定为枚举类型,其可能的值只能是“default”和“preserve”。如果指定为“preserve”,则所定义元素内的空白字符必须保留。
作者: ttggl 时间: 2009-5-25 12:53
示例:
XML数据
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://quicklearn.cn"/>
<part1>
<ns0:books xmlns:ns0="http://books.quicklearn.cn"/>
<ns0:book>
<name>BizTalk Develop</name>
<ISDN>0101010101010</ISDN>
</ns0:book>
</ns0:books>
</part1>
<part2>
<ns1:customers xmlns:ns1="customers.quicklearn.cn">
<customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer>
</ns1:customers>
</part2>
</root>
C#代码
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(@"D
rojectsTempXSLTTestXSLTTestXSLTTestXMLData2.xml");
this.richTextBox1.Text = xmlDoc.OuterXml;
输出效果
<?xml version="1.0" encoding="utf-8"?><root xmlns="http://quicklearn.cn"/><part1><ns0:books xmlns:ns0="http://books.quicklearn.cn"/><ns0:book><name>BizTalk Develop</name><ISDN>0101010101010</ISDN></ns0:book></ns0:books></part1><part2><ns1:customers xmlns:ns1="customers.quicklearn.cn"><customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer></ns1:customers></part2></root>
BizTalk开发系列(十四) XML空白字符(WhiteSpace)
BizTalk开发系列(十四) XML空白字符(WhiteSpace)
XSLT 转换。W3C XSLT 规范提供了两个元素(即 xsl:strip-space 和 xsl:preserve-spacea
作者: ttggl 时间: 2009-5-25 12:54
示例: XML数据
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://quicklearn.cn%22/%5C%22]http://quicklearn.cn"/[/url]>
<part1>
<ns0:books xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://books.quicklearn.cn%22/%5C%22]http://books.quicklearn.cn"/[/url]>
<ns0:book>
<name>BizTalk Develop</name>
<ISDN>0101010101010</ISDN>
</ns0:book>
</ns0:books>
</part1>
<part2>
<ns1:customers xmlns:ns1="customers.quicklearn.cn">
<customer xml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer>
</ns1:customers>
</part2>
</root>
C#代码
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(@"D
rojectsTempXSLTTestXSLTTestXSLTTestXMLData2.xml");
this.richTextBox1.Text = xmlDoc.OuterXml;
输出效果
<?xml version="1.0" encoding="utf-8"?><root xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://quicklearn.cn%22/%3E%3Cpart1%3E%3Cns0:books%5C%22]http://quicklearn.cn"/><part1><ns0:books[/url] xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://books.quicklearn.cn%22/%3E%3Cns0:book%3E%3Cname%3EBizTalk%5C%22]http://books.quicklearn.cn"/><ns0:book><name>BizTalk[/url]Develop</name><ISDN>0101010101010</ISDN></ns0:book></ns0:books></part1><part2><ns1:customersxmlns:ns1="customers.quicklearn.cn"><customerxml:space="preserve">
<name>Zhang San</name>
<mobile>133333333333</mobile>
<address>
<province>Guang Dong</province>
<city>Shen Zhen </city>
</address>
</customer></ns1:customers></part2></root>

XSLT转换。W3C XSLT 规范提供了两个元素(即 xsl:strip-space 和xsl:preserve-spacea
作者: ttggl 时间: 2009-5-25 12:54
BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified。
XMLSchema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如“<ns0:root>...</ns0:root>”之类的格式。一般情况下在BizTalkSchema编辑器中设置架构的属性
elementFormDefault /AttributeFormDefault
在该 schema 的目标命名空间中声明的元素的形式。该值必须是下列字符串之一: "qualified" 或 "unqualified"。 默认值为 "unqualified"。
"unqualified" 指示无须通过命名空间前缀限定目标命名空间的元素/属性。
"qualified" 指示必须通过命名空间前缀限定目标命名空间的元素属性。
另外可以直接在记录、元素、属性的属性窗口设置Form的值.
Form
如果该值是 “unqualified”,则无须通过命名空间前缀限定该元素。
如果该值是 “qualified”,则必须通过命名空间前缀限定该元素。
Schema中对于声明是可以继承的,但也是可以重写声明的。即如果在架构中声明了ElementFormDefault属性(全局声明)而子元素没有声明Form(局部声明)的话则该元素则继承ElemnetFormDefault属性。如果子元素重新声明了Form属性则该声明在该元素上优先于全局的声明。
通过以上的设置通常就可以实现对架构,元素或属性的命名空间前缀限定。但在有些情况下虽然设置了ElementFromDefault(Attribute一般为属性部声明)的值为UnQualified。但是使用生成实例生成的XML元素或记录还是会带命名空间前缀(如下XML),这种情况一般发生在使用Schema生成向导生成的Schema,从XDR(BizTalk2002以前使用的Schema格式)转到XSD(BizTalk 2004以后使用的Schema 格式)。
作者: ttggl 时间: 2009-5-25 12:55
<ns0:Root DATE="DATE_0" xmlns:ns0="http://schemasample.test">
<ns0:Record>
<ns0:SubRecord NUM="NUM_0">
<ns0:TestField>TestField_0</ns0:TestField>
</ns0:SubRecord>
</ns0:Record>
</ns0:Root>
经过测试发现Schema的设置不能应用到子记录或元素的原因是记录的类型为引用类型,并且引用了全局的元素。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://orchtest.schema1/" elementFormDefault="unqualified" targetNamespace="http://orchtest.schema1/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<b:schemaInfo standard="XML" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" root_reference="Root" displayroot_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Record1">
<xs:complexType />
</xs:element>
<xs:element name="Field1" type="xs:string" />
<xs:element name="Field2" type="xs:string" />
<xs:element name="Record2" type="Record2" />
<xs:element minOccurs="1" maxOccurs="1" ref="ExtRecord" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ExtRecord">
<xs:complexType>
<xs:choice minOccurs="0">
<xs:element name="TestField">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
<xs:attribute name="NUM" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:complexType name="Record2">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:attribute name="Field" type="xs:string" />
</xs:complexType>
作者: ttggl 时间: 2009-5-25 12:55
请注意上图的几个背景部分: 绿色部分 为在架构中声明全局属性即元素不需要命名空间前缀限定
灰色部分 为在Schema编辑器中自定义的Complex Type.
黄色部分 为转换向导生成的类型
粉色部分 为在Root节点引用ExtRecord元素的类型。
特别注意红色部分,如果没有加上红色部分的声明的话在BizTalk编辑器会显示所有元素。即会出现两个ExtRecord节点。
使用Schema生成实例生成的XML数据如下:
<ns0:Root xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://OrchTest.Schema1[/url]">
<Record1 />
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
<Record2 Field="Field_0" />
<ns0:ExtRecord NUM="NUM_0">
<TestField>TestField_0</TestField>
</ns0:ExtRecord>
</ns0:Root>
我们再来改变一下Schema(注意,此修改是在XML编辑器进行,而不是在BizTalk的Schema编辑器。右击Schema文件,选择打开方式,在对话框中选择XML编辑器)
更改之后的XML如下:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" xmlns="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://orchtest.schema1/[/url]" elementFormDefault="unqualified" targetNamespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://orchtest.schema1/[/url]" xmlns:xs="[url=http://tech.ddvip.com/2008-10/%5C%22http://www.w3.org/2001/XMLSchema%5C%22]http://www.w3.org/2001/XMLSchema[/url]">
<xs:annotation>
<xs:appinfo>
<b:schemaInfo standard="XML" xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" root_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Record1">
<xs:complexType />
</xs:element>
<xs:element name="Field1" type="xs:string" />
<xs:element name="Field2" type="xs:string" />
<xs:element name="Record2" type="Record2" />
<xs:element name="ExtRecord">
<xs:complexType>
<xs:choice minOccurs="0">
<xs:element name="TestField">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
<xs:attribute name="NUM" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Record2">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" />
</xs:appinfo>
</xs:annotation>
<xs:attribute name="Field" type="xs:string" />
</xs:complexType>
</xs:schema>
保存Schema。生成实例如下:
<ns0:Root xmlns:ns0="[url=http://tech.ddvip.com/2008-10/%5C%22http://orchtest.schema1/%5C%22]http://OrchTest.Schema1[/url]">
<Record1 />
<Field1>Field1_0</Field1>
<Field2>Field2_0</Field2>
<Record2 Field="Field_0" />
<ExtRecord NUM="NUM_0">
<TestField>TestField_0</TestField>
</ExtRecord>
</ns0:Root>
经查证。XML Schema中的全局声明必须是唯一的,而全局模式中的每一个声明都自动进入目标名称空间。因此ElementFormDefault的设置不能作用于该元素。
作者: ttggl 时间: 2009-5-25 12:56
BizTalk开发系列(十六) XML命名空间。
BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操作。则有机会遇到XML命名空间的问题。常见的是使用Xpath选取节点的时候不知道要不要加上命名空间前缀,或者是什么时候该加什么时候不该加。为此,做一个Sample来校验一下XML命名空间在XML操作过程中的影响。
名称空间是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属性,避免了名称之间的**。XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
Sample说明
新建一个测试XML。内容如[Code1]设置不同的命名空间使用场景。另外新建一个XSLT(XML转换语言)文件,内容如[Code2]。在 Visual Studio中使用XSLT测试中的断点在监视窗口通过Xpath查询。校验在什么情况下哪些节点需要命名空间。
[Code1]
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0="http://quicklearn.cn" xmlns:ns1="http://addressbook.quicklearn.cn" xmlns:ns2="http://person.quicklearn.cn">
<ns1:addressbook id="1" >
<ns2:person>
<name>cbcye</name>
<mobile>12345</mobile>
</ns2:person>
</ns1:addressbook>
</Root>
作者: ttggl 时间: 2009-5-25 12:56
[Code2]
<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="[url=http://tech.ddvip.com/2008-10/%22http://www.w3.org/1999/XSL/Transform/%22]http://www.w3.org/1999/XSL/Transform[/url]"
version="1.0"
xmlns:qn="[url=http://tech.ddvip.com/2008-10/%22http://quicklearn.cn%22//%22]http://quicklearn.cn"/[/url]
xmlns:adr="[url=http://tech.ddvip.com/2008-10/%22http://addressbook.quicklearn.cn%22//%22]http://addressbook.quicklearn.cn"/[/url]
xmlns:per="[url=http://tech.ddvip.com/2008-10/%22http://person.quicklearn.cn%22//%22]http://person.quicklearn.cn"/[/url]
>
<xsl:template match="/">
<xsl:apply-templates select="/"/>
</xsl:template>
</xsl:stylesheet>
[测试贴图]
缺省命名空间
缺省命名空间适用于声明它的元素(如果那个元素没有命名空间前缀)和所有该元素内容中所有没有前缀的元素。假如在缺省命名空间声明里的 URI 引用为空,那么在声明范围内没有前缀的元素不被认为存在任何命名空间里。注意缺省命名空间不直接适用于属性。
Test1 无命名空间
<?xml version="1.0" encoding="utf-8"?>
<Root>
<addressbook id="1">
…
</addressbook>
</Root>
作者: ttggl 时间: 2009-5-25 12:56
元素:addressbook Xpath表达式: /Root/addressbook 属性:id Xpath表达式: /Root/addressbook /@id
Test2 有命名空间
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns=http://quicklearn.cn/>
<addressbook id="1">
…
</addressbook>
</Root>
元素:addressbook Xpath表达式: /qn:Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/qn:addressbook/@id (qn为在XSLT文件中声明的前缀)
命名空间前缀
命名空间前缀提供合法名字的命名空间前缀部分,并且必须与在命名空间声明中的一个命名空间 URI 引用相关联。注意前缀只起命名空间占位符的作用。应用程序应使用命名空间名,而不是前缀,来构成有效范围在所含文档之外的名字。
Test1 前缀+根节点
<?xml version="1.0" encoding="utf-8"?>
<ns0:Root xmlns:ns0=http://quicklearn.cn/>
<addressbook id="1">
…
</addressbook>
</ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/addressbook /@id (qn为在XSLT文件中声明的前缀)
Test2 前缀+ 子元素
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0=http://quicklearn.cn/>
<ns0:addressbook id="1">
…
</ns0:addressbook>
</Root>
作者: ttggl 时间: 2009-5-25 12:56
元素:addressbook Xpath表达式: /Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/qn:addressbook /@id (qn为在XSLT文件中声明的前缀)
多个命名空间
在一个XML文档中存在多个命名空间,命名空间通过缺省或都前缀约束元素或属性存在于中个命名空间。
Test1
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns=http://quicklearn.cn/>
<addressbook id="1" xmlns=http://addressbook.quicklearn.cn/>
…
</addressbook>
</ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/adr:addressbook (qn,adr为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/adr:addressbook /@id(qn,adr为在XSLT文件中声明的前缀)
Test2
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:ns0="http://quicklearn.cn"/ xmlns:ns1="http://addressbook.quicklearn.cn"/ xmlns:ns2="http://person.quicklearn.cn"/>
<ns1:addressbook id="1" >
<ns2:person>
<name>cbcye</name>
<mobile>12345</mobile>
</ns2:person>
</ns1:addressbook>
</Root>
作者: ttggl 时间: 2009-5-25 12:58
BizTalk开发系列(十六) XML命名空间。


元素:name Xpath表达式: /Root/adr:addressbook/per:person/name
(qn,adr,per为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/adr:addressbook/@id (qn,adr为在XSLT文件中声明的前缀)
总结
XML命名空间使用规则大概可以归纳如下:缺省命名空间约束全局,带前缀命名空间约束局部,局部声明优先全局。另外如果你能坚持看到这里的话顺便回答一下这个问题:以下XML文档中Test节点有无命名空间?如果有的话命名空间是什么?
<ns0:Root xmlns:ns0="http://quicklearn.cn"><Test></Test></ns0:Root>
[Update: 2008.10.21 11:40]
如果您有安装XML Spy的话。则可以直接使用XML Spy的Xpath求值功能(在菜单栏中点击XML选择求Xpath值)。直接使用Xpath表达式求得各节点或属性的Namespace。

Xpth表达式
//concat(local-name()," >>> ",namespace-uri()) 所有节点,包括空白字符
//@*/concat(local-name()," >>> ",namespace-uri()) 所有属性节点
//*/concat(local-name()," >>> ",namespace-uri()) 所有节点,不包括空白字符
作者: ttggl 时间: 2009-5-25 12:59
BizTalk开发系列(十七) 信封架构(Envelop)。
在BizTalk开过中使用信封架构可以提高BizTalk处理性能。比如在使用SQLAdapter时使用信封选取多条记录在通过管道的XML拆装器时将信封里的XML消息部分拆分为单独的消息,发布到MessageBox。BizTalk会创建多个处理实例处理这些消息。减少SQL Adapter与数据库的交互次数。
什么是信封架构?
微软官方对信封架构是这样定义的:信封架构是一种特殊类型的 XML 架构。(不是W3C定义的)信封架构用于定义 XML信封的结构,以用于将一个或多个 XML 业务文档包装到单个 XML 实例消息中。在将 XML架构定义为信封架构时,根据是否在信封架构中定义了多个根记录,可能需要其他一些属性设置。
如何创建信封架构?
大部分情况下信封架构是一个比较简单的XML架构。因为在XML拆装过程中信封部分的内容是要被删除的。当然除了信封的升级属性和可分辨字段会升级到消息的上下文中被信封里的消息个体所继承。在BizTalkSchema编译器中创建信封架构前几步跟创建普通架构是一样的,只不过需要设置一下相关的属性。具体是这样的:
创建一个Schema。点击<Schema>在属性设置中设置Envelop属性为Yes。在信封根(Root)中设置“正文Xpath”。如果架构中存在多个根且没有设置根引用则需要为每个根设置”正文 Xpath”。如果架构在存在多个根且设置了根引用则为根设置“正文Xpath”。其他根则可选。
一般情况下,在“正文Xpath”设置的对话框中选择相应的节点则可以自动生成相应的Xpath表达式。如果自动生成功能无法满足用户需求的情况下,用户可以手动输入Xpath表达式。
信封的拆装
信封的拆装发生在接收管道的的拆装阶段通过使用XML拆装器完成的。XML 拆装器管道组件将 XML 解析功能和拆装功能组合到一个组件中。该组件的主要功能如下:
删除信封。
根据预定义的Xpath对消息正文进行拆装。
将信封部分的可分辨字段和属性升级到消息上下文。
收到消息之后,拆装器通过使用在设计时指定的与该组件关联的架构来静态地解析,或通过在运行时根据消息类型(Namespace#RootName)确定信封架构来动态地解析。架构用于在信封解析过程中对消息的结构进行验证。如果未定义架构构,则可通过使用根节点的命名空间和基名称查找架构,从而以递归方式确定消息架构。
如果有且只有一个架构与消息匹配,则拆装器读取架构的批注内容,如下所示。(可能实际过程中会读取更多信息)
<xs:appinfo> <b:schemaInfo is_envelope="yes" xmlns:b="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003%5C%22]http://schemas.microsoft.com/BizTalk/2003[/url]" /> 架构批注指明此消息为信封架构。拆装器通过使用预定义的 XPath(编码为与信封和消息相关联的 XSD架构中的批注)从信封和消息实例中提取内容属性。该组件将对信封内的每个文档进行解析。对于每个文档,BizTalk消息对象都使用其本身的上下文创建,从信封和文档本身升级的所有属性均是从此上下文中复制而来。
<xs:element name="Root">
<xs:annotation>
<xs:appinfo>
<b:recordInfobody_xpath="/*[local-name()='Root' andnamespace-uri()='http://SchemasAPP.EnvelopSchema']/*[local-name()='EnvelopBody'and namespace-uri()='']" />
拆装器的“RecoverableInterchangeProcessing”属性表示:如果值为True则信封中的所有消息都能找到唯一的消息架构时该信封中的所有正文消息才会处理,否则挂起所有消息。如果值为False则只有找不到消息架构的消息会被挂其他消息则会被处理。(此功能不只针对信封消息!)
参考资料: 《Microsoft BizTalk 2006 Help》
作者: ttggl 时间: 2009-5-25 12:59
BizTalk开发系列(十八) 使用信封拆分数据库消息。
之前写了一篇的《BizTalk开发系列(十七)信封架构(Envelop)》是关于信封架构及其拆装原理的,都是理论性的内容。信封在BizTalk开发过程中最常用的应该是在读取SQLServer 数据库的时候。一次性读取多条消息,提高了SQL Adapter对SQLServer的读取性能。今天就来做一下这个实例,增强对信封消息的理解。
数据库采用的是SQL Server 2005示例数据库:AdventureWorks 通过select * from Production.Culture选择所有的Cluster信息。如下图所示:
创建表架构和信封架构
创建BizTalk项目之后,根据生成架构向导生成数据库中表架构。在架构信息中的目标命名空间和文档根节点中依下图分别输入相应的值。
在类型中选择SQL脚本,在脚本编辑窗口输入如下脚本(表示将表列名映射为架构中的元素):
select * from Production.Culture for xml auto,elements
架构生成向导会生成架构文件,内容如下。同时也会产生一个声明了此类型的Orchestration,可以将此Orchestration删除。
需要修改生成的Schema.将Production.Culture节点下的所有元素提升到根节点下。根节点修改为:Production.Culture。最后将子节点的Production.Culture删除。修改后的内容如下:
修改了表架构,现在需要另外创建一个信封架构。信封架构设计需要注意几点:1. 命令空间跟表架构保持一致。2.根节点必须为:EnvelopRoot。当然这两点也不一定非得都遵从。如果你已经很清楚了信封的原理则应该知道为什么要这么做和如何根据需要进行修改。
信封架构的创建比较简单。创建一个架构,目标命名空间跟表架构一致,信封属性设置为Yes。将根节点名称修改为:EnvelopRoot。在根节点的属性中修改根节点的数据构造类型设置为:xs:anyType(注:anyType为Schema中所有类型的基类,类似于C#中的System.Object)。在设置根节点BodyXpath的对话框中选择EnvelopRoot。
部署项目,创建接收端口和订阅发送端口
两个Schema创建好之后就可以部署项目了。在部署项目之前需要设置程序集密钥,应用程序名称。部署项目之后可以新建接收端口:ReceiveSQLRecords 参照下图配置SQL接收位置。注意Document Root ElemntName的值要与信封架构的根节点值一致。Document TargetNamesapce值也要与信封,表架构的目标命名空间一致。接收管道选择系统内置的:XMLRecive
新建发送端口,在发送端口的Filter选项中定义过滤规则为:BTS.ReceivePortName == ReceiveSQLRecords。
测试
启动BizTalk项目,在发送位置的文件夹会生成经过拆分的消息。由于BizTalk在读取数据之后没有对数据库的记录进行删除操作所以每次BizTalk SQL Adapter轮询的时候SQL脚本都能取到消息。以至于不断的生成消息到目标文件夹中。需要关闭端口或应用程序。
总结
通过架构拆分数据库记录是信封使用的经典案例。我们将接收管道改为
assThruReceive。可以得到从数据库生成的原始消息,如下图。当然如果你有兴趣的话可以结合:《BizTalk开发系列(十七) 信封架构(Envelop)》分析一下拆装的过程。
作者: ttggl 时间: 2009-5-25 12:59
BizTalk开发系列(十九) BizTalk命名规范。
目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束。根据以往BizTalk项目的经验,整理了BizTalk命名规范。包括:BizTalk Application, Schema, Map, Pipeline, Orchestration Logic Port, Physical Port等。并提供了相关的示例方便大家参考。
《BizTalk命名规范》
通用:
项目中能用英文单词的用单词,否则用拼音。
BizTalk项目中的Schema , Map, Orchestration , Pipeline文件的完全合格名称默认为项目的命名空间加点号加文件的类名。如无特别说明不做相应修改。
BizTalk项目中的文件名称默认和类名称一致,如无特别说明BizTalk项目中的项目成员名称不能与C#保留字一样。例如:schema.xsd、XmlContent 和 RootNodes
1.Biztalk应用程序命名
格式:项目组名称.项目名称.应用程序名称
示例:BTSGroup.EAI.General
2.Schema命名
常规Schema/平面文件Schema
格式:Sch_业务名_ 描述
示例:Sch_PO_Src.xsd
说明:Schema的文件名称(不包括后缀)应与Schema的文件类名一致。
根节点名称不能使用.NET关键字或保留字,例如 System
信封Schema
格式:Sch_Envelop_描述
示例:Sch_Envelop_PO
命名空间
格式: http://schemas.项目名称.项目组名称/时间/业务/描述
示例: http://schemas.eai.btsgroup//2008/po/posource
说明: 在描述里面可以使用"-"
Schema节点、元素、属性
说明:只允许使用 字母、数字、下划线
3.Mapping命名
格式:Map_业务名称_描述
示例:Map_PO_Src2Trg.btm
说明:Map的文件名称(不包括后缀)应与Map的文件类名一致。
4.自定义PipeLine命名
格式:
接收管道 : Pip_R_描述.btp
发送管道 : Pip_S _描述.btp
示例:
接收管道: Pip_R_AddNS.btp
发送管道:Pip_S_RemoveNS.btp
说明:Pipeline的文件名称(不包括后缀)应与Pipeline的文件类名一致。
5.Orchestration命名
Orchestration文件/类型命名
格式:
主流程 :Orc_Main_ 描述.odx 如: Orc_Main_Business.odx
子流程 : Orc_Sub_ 描述.odx 如: Orc_Sub_Starter.odx
示例:
主流程 :Orc_Main_POProcess.odx
子流程 : Orc_Sub_Initialization.odx
说明:Orchestration的文件名称(不包括后缀)应与Orchestration的文件类名一致。
Message命名
格式:业务名_ 描述Msg
示例:POProcess_POMsg
Multity Message命名
格式:Multi_业务名称_描述
示例: Multi_POProcess_PO
说明:如果是单部分消息则参数取名为 "Body"
变量命名
格式:用途描述及类型
示例: tempXmlDoc
相关集与相关集类型命名
格式:
相关集类型命名 : Corn_业务名称_描述Type
相关集命名 : Corn_业务名称_描述
示例:
相关集类型: Corn_Starter_GenType
相关集: Corn_Starter_Gen
端口类型命名
格式:
逻辑接收端口类型命名 : 业务_描述 _RecType
逻辑发送端口类型命名 : 业务_描述_SendType
示例:
PO_GetDB_PType
PO_InsDB_PType
逻辑端口命名
格式:
逻辑接收端口命名 : 描述
逻辑发送端口命名 : 描述
示例:
PublishPO
物理端口命名
格式:
物理接收端口命名 : RecPort+描述
物理接收端口位置命名 : RecLocn_描述
物理发送端口命名 : SendPort _描述
物理发送端口组命名: 用途描述单词 + SendPortGroup 如: InsertDB_SendPortGroup
示例:
RecPort_POData
RecLocn_MSIDB
SndPort_MSIDB
流程形状名称命名
采用动宾名称 ,动词根据形状名称命名,判断形状和表达式形状除外。常规使用描述即可。
作者: ttggl 时间: 2009-5-25 13:00
BizTalk开发系列(二十一) Mapping 扩展开发。
BizTalkMap编辑器提供了常用的功能块,比如数据库,字符串,数字计算等功能。可在设计Map时直接使用这些功能块进行扩展。除此之外对于进行复杂的Map处理,Map 编辑器提供了扩展XSLT,扩展XML以及脚本功能块。给Map开发提供了强大的可扩展空间。BizTalkSDK已经提供了Map扩展的Sample(C:Program FilesMicrosoft BizTalk Server2006SDKSamplesXmlToolsExtendingMapper)。以下将分别针对不同场景讲述这些扩展功能。
自定义扩展XML
如果在自定义XSLT或者在内联型的XSLT中使用外部.NET程序集。则需要使用自定义扩展XML将命名空间与程序集、类关联。自定义扩展XML内容如下:
<ExtensionObjects>
<ExtensionObject Namespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://schemas.microsoft.com/BizTalk/2003/ScriptNS0%5C%22]http://schemas.microsoft.com/BizTalk/2003/ScriptNS0[/url]"
AssemblyName="CustomFunctions, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
ClassName="CustomFunctions.MyClass" />
</ExtensionObjects>
使用时需要在Map网格属性的Custom Extension XML对话框里设置自定义XML的路径。
自定义XSLT
如果具有已用于转换实例消息的 XSLT 代码,则可以直接使用该代码,而不用创建映射。直接在Map编辑器中创建空映射(不创建源与目标Schema的链接)并在Custom Extension XSLT对话框设置自定义XSLT路径。

使用自定义XSLT时需要注意,如果使用自定义XSLT则Map文件中的映射不会产生作用。另外如果自定义XSLT文件的内容有变的话需要重新设置一次自定义XSLT路径。否则变更的内容不会产生作用。
脚本功能块
使用“脚本”功能块可以在运行时使用自定义脚本或代码执行通常情况下不可用的函数。例如,可以通过使用“脚本”功能块并编写自己的自定义函数,在运行时调用 .NET 程序集。“脚本”functoid 支持以下语言:
C# .NET
JScript .NET
Visual Basic .NET
可扩展样式表语言转换 (XSLT)
XSLT 调用模板
BizTalk 将内联脚本保存在定义映射的可扩展样式表语言转换 (XSLT) 样式表中。因此,内联脚本可以与其他任何 XSLT 样式表脚本使用相同的命名空间。下表显示了可用的命名空间:
| 命名空间 | 说明 |
| System | 系统类。 |
| System.Collection | **类。 |
| System.Text | 文本类。 |
| System.Text.RegularExpressions | 正则表达式类。 |
| System.Xml | 核心 XML 类。 |
| System.Xml.Xsl | XSLT 类。 |
| System.Xml.Xpath | XPath 类。 |
| Microsoft.VisualBasic | Visual Basic 脚本类。 |
支持的脚本类型可以通过Script Type Precedence对话框中选择设置。

1. 使用内联型C#脚本
编辑内联型C#脚本,只在要Configure Functoid Script对话框选择脚本类型为内联C#. 在内联脚本缓冲区输入代码即可。下图是使用内联代码执行字符串组合。

除对于一次性脚本很方便之外,内联脚本对于声明在多个脚本中使用的全局变量也很有用。例如,在 C# 内联脚本中,可以将以下代码行放在任何类之外:
System.Collection.ArrayListstatusList=newSystem.Collection.ArrayList();
该代码将创建一个 ArrayList(即 statusList),可能在所有内联型脚本中访问对此对话。比如可以在XSLT表达式里直接从ArrayList对像中存取值。
2.使用内联型XSLT
XSL(EXtensible Stylesheet Language)可扩展样式表语言,将XML中的数据用指定的显示格式输出.XSL 包含两个部分:
XSLT 用于转换 XML 文档的语言. XSLT 是指 XSL 转换 (XSL Transformations (XSLT) Version 2.0)
XPath 用于在 XML 文档中导航的语言(XML Path Language (XPath) 2.0)
以下码表示复制当前节点的Field1属性值到目标Record节点下的Field1属性。
<xsl:element name="Record">
<xsl:attribute name="Field1">
<xsl:value-of select="@Field1" />
</xsl:attribute>
</xsl:element>
3.使用内联型XSLT模板
XSLT模板当指定的节点被匹配时所应用的规则。通过在内联XSLT模板输入代码。Map使用xsl:call-template函数调用
新建的MyXsltConcatTemplate
<xsl:template match="/s0:Root">
<ns0:Root>
<xsl:call-template name="MyXsltConcatTemplate">
<xsl:with-param name="param1" select="string(Field1/text())" />
<xsl:with-param name="param2" select="string(Field2/text())" />
</xsl:call-template>
</ns0:Root>
</xsl:template>
<xsl:template name="MyXsltConcatTemplate">
<xsl:param name="param1" />
<xsl:param name="param2" />
<xsl:element name="Field1">
<xsl:value-of select="$param1" />
</xsl:element>
</xsl:template>
4.使用外部.NET 程序集
Map支持直接使用外部.NET程序集(该程序集必须安装在GAC)。如果外部程序发生了改变,需要重新启动Visual Studio。
使用外部程序集编写脚本是在 BizTalk中使用脚本的首选方式。外部程序集具有以下优点:
便于代码共享
维护更简单
调试更方便
若要重新使用脚本,只需要设置“脚本”functoid 的“脚本”属性即可。由于脚本储存在映射之外,因此可以在不更改映射的情况下修改脚本。
5.在XSLT中调用外部.NET程序集
在XSLT中调用外部.NET程序集需要使用自自定义扩展XML,将命名空间跟程序集关联。以下脚本表示在XSLT
表达式中调用外部.NET程序集的StringConcatenet方法。
缓冲区输入的XSLT脚本
<xsl:template name="ConcatenateXSLTTemplate">
<xsl:param name="param1" />
<xsl:param name="param2" />
<xsl:element name="Record">
<xsl:variable name="var:v1" xmlns:Functions="[url=http://tech.ddvip.com/2008-10/%5C%22http://functions.mappinghelper%22/%5C%22]http://functions.mappinghelper"/[/url]
select="Functions:StringConcatenate($param1, $param2)" />
<xsl:attribute name="Field1">
<xsl:value-of select="$var:v1" />
</xsl:attribute>
</xsl:element>
自定义扩展XML代码内容:
<ExtensionObjects>
<ExtensionObject Namespace="[url=http://tech.ddvip.com/2008-10/%5C%22http://functions.mappinghelper%22/%5C%22]http://functions.mappinghelper"/[/url]AssemblyName="MappingHelper, Version=1.0.0.0, Culture=neutral,PublicKeyToken=f41f519fda5ae4ca"ClassName="MappingHelper.Functions"/>
</ExtensionObjects>
总结
通过介绍基本涵盖了所有的Map开发方法(自定义Functoid的开发另外介绍),在Map开发过程中根据需要综合使用多种方法。有一个奇怪的问题是不要在一个Script里使用多种类型的脚本。比如要所Inline C#和InlineXSLT的代码放置不两个不同的Script功能块里,否则有可能出现跟预想不同的情况。另外注意:应避免多次使用同一个方法签名。如果多个“脚本”functoid 具有相同的方法签名,则 BizTalk 会选择实现的第一个方法签名,而忽略其他签名。
作者: ttggl 时间: 2009-5-25 15:03
BizTalk开发系列(二十二) 开发自定义Map Functoid。
尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况。《BizTalk开发系列 Map扩展开发》介绍了通过使用自定义XSLT,脚本 Functoid等方法来扩展。这里要介绍的是通过自定义 functoid 的方法扩展。
每个自定义Functoid为从Microsoft.BizTalk.BaseFunctoids派生的类的 .NET程序集。一个程序集可包含多个自定义 functoid。下图的FormatDate功能块是自定义开发的Functoid,功能是将输入参数1的字符串按参数2的格式输出。部署之后添加到工具箱。
微软提供了相关使用自定义Functoid的场景:
您对使用只能通过专用旧式 API 访问的数据的字符代码字段应用特殊的验证和转换规则。
您需要使用自定义业务逻辑和密钥管理来加密或解密字段。
您需要从部分消息生成哈希代码以用于其他应用程序。
财务要求传输到他们部门的消息包含有关每种产品类型销售总额的摘要信息。
您希望通过合并一些相关步骤、使用其他方法或使用新的类库来降低映射的复杂性。
多个映射在脚本 functoid 中使用相同的脚本代码。
您需要将操作失败写入事件日志。
开发自定义Functoid有以下几个类别:
自定义引用 Functoid
自定义引用的 Functoid 不会将内联的实现代码复制到映射中。实际上,它将对程序集、类和方法的引用放置在与生成的样式表相关联的扩展对象文件中,并在运行时对其进行调用。
自定义内联 Functoid
自定义内联 functoid 通过将实现代码直接复制到映射中提供功能,而不像自定义引用的 functoid 通过引用程序集、类和方法名称来提供功能。
作者: ttggl 时间: 2009-5-25 15:06
自定义累计 Functoid
自定义累计 functoid 可以对在一个实例消息中多次出现的值执行累计操作。
使用内联代码可直接将自定义 functoid 集成到解决方案中,也可以通过引用部署在全局程序集缓存中的类库的方法来间接集成。这两种类型的集成都依赖于 BizTalk.BaseFunctoid 类并遵循同样一组通用步骤:
使用您选择的 .NET 语言创建新的类库项目。
使用强名称实用程序 sn.exe 创建密钥文件并将其指定给项目。
添加对 Microsoft.BizTalk.BaseFunctoids.dll 的引用。此程序集包含 BaseFunctoid 基类。
创建资源文件并将其添加到项目中。为 functoid 名称、工具提示和说明添加字符串资源。添加一个 16x16 像素的图像资源,在映射设计器面板上代表该 functoid。
实现 functoid 类,方法是从 BaseFunctoid 派生该类,在构造函数中建立基本参数,然后编写 functoid 方法和所有支持方法。该程序集可包含多个自定义 functoid。
部署该程序集并确保可从工具箱面板访问新 functoid。
Format Date Functoid代码
using System;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Globalization;
namespace Quicklearn.CN.BTS.CustomerFunctoids
{
public class FormatDate : BaseFunctoid
{
public FormatDate()
: base()
{
//Functoid的ID号.尚未用过的大于6000的值.
this.ID = 88888;
//资源文件
SetupResourceAssembly("Quicklearn.CN.BTS.CustomerFunctoids.Resource", Assembly.GetExecutingAssembly());
//Functoid的名称,描述,说明,图像
SetName("QUICKLEARN_CN_FORMATDATE_NAME");
SetTooltip("QUICKLEARN_CN_FORMATDATE_TOOLTIP");
SetDescription("QUICKLEARN_CN_FORMATDATE_DESCRIPTION");
SetBitmap("QUICKLEARN_CN_FORMATDATE_BITMAP");
//this.HasVariableInputs = true; //参数个数是否不确定
this.SetMinParams(2);//最小参数
this.SetMaxParams(2);//最大参数
SetExternalFunctionName(GetType().Assembly.FullName, "Quicklearn.CN.BTS.CustomerFunctoids.Resource", "Format");
this.Category = FunctoidCategory.String; //分类
this.OutputConnectionType = ConnectionType.All;//输出类型
//设置支持的脚本格式(内联型Functoid需要设置此项).
AddScriptTypeSupport(ScriptType.CSharp);
//内联型的脚本,代码将会被拷贝到XSLT文件中.方便调试.
SetScriptBuffer(ScriptType.CSharp, InitFormat(), 0);
AddInputConnectionType(ConnectionType.All); //第一个参数类型
AddInputConnectionType(ConnectionType.All); //第二个参数类型
}
public string Format(string paramDate,string paramExpress)
{
string responseDate = paramDate;
try
{
DateTime strDate = Convert.ToDateTime(paramDate);
responseDate = strDate.ToString(paramExpress);
}
catch { }
return responseDate;
}
//将方法代码映射到XSLT。
private string InitFormat()
{
StringBuilder builder = new StringBuilder();
builder.Append("public string Format(string paramDate,string paramExpress)n");
builder.Append("{n");
builder.Append(" string responseDate = paramDate;n");
builder.Append(" tryn");
builder.Append("{n");
builder.Append(" DateTime strDate = Convert.ToDateTime(paramDate);n");
builder.Append(" responseDate = strDate.ToString(paramExpress);n");
builder.Append("}n");
builder.Append("catch { }n");
builder.Append("return responseDate;n");
builder.Append("}n");
return builder.ToString();
}
}
}
作者: ttggl 时间: 2009-5-25 15:06
BizTalk开发系列(二十二) 开发自定义Map Functoid
测试
自定义Functoid 的测试工作非常不方便,简化该过程可以先使用自定义内联脚本或外部程序集的方式先将程序调整完好。另外对于内联Functoid可以将Map生成XSLT 进行详细调试。以下是通过验证Map生成的XSLT内容,内联型的Functoid已经将方法代码拷贝到XSLT中。
XSLT Code
<?xml version="1.0" encoding="UTF-16" ?>
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 userCSharp" version="1.0" xmlns:ns0="http://TestFormatDate.Distenation" xmlns:s0="http://TestFormatDate.Source" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
- <xsl:template match="/">
<xsl:apply-templates select="/s0:Root" />
</xsl:template>
- <xsl:template match="/s0:Root">
- <ns0:Root>
<xsl:variable name="var:v1" select="userCSharp:Format(string(Field1/text()) , "dd-MM-yyyy")" />
- <Field1>
<xsl:value-of select="$var:v1" />
</Field1>
</ns0:Root>
</xsl:template>
- <msxsl:script language="C#" implements-prefix="userCSharp">
- <![CDATA[
public string Format(string paramDate,string paramExpress)
{
string responseDate = paramDate;
try
{
DateTime strDate = Convert.ToDateTime(paramDate);
responseDate = strDate.ToString(paramExpress);
}
catch { }
return responseDate;
}
]]>
</msxsl:script>
</xsl:stylesheet>
作者: ttggl 时间: 2009-5-25 15:07
BizTalk开发系列(二十三) BizTalk性能指标参考。
BizTalk项目目前比较少,使用的客户也不多。大多只知道BizTalk是一个不错的产品,是MicrosoftSOA平台的核心产品,不过还没有将其应用到生产环境。还有一些客户对BizTalk的性能不是很了解。于是我们做项目的时候也要对BizTalk进行一些相关的性能测试。以下是微软官方的性能指标,可供性能测试的时候做下参考。 CPU 使用率
| 服务器 | 平均 CPU 使用率 |
| BizTalk Server | 55% |
| SQL Server(主 MessageBox 服务器) | 76% |
| SQL Server(其他 MessageBox 服务器) | 83% |
物理磁盘空闲时间
| 服务器 | 平均磁盘空闲时间 |
| 用于所有 SQL Server 的平均值 | 69% |
SQL Server 上的 SQL 锁
| 参数 | 值 |
| 每秒平均总锁定超时(每个 SQL Server) | 1980 |
| 平均总锁定等待时间(毫秒) | 495 |
如果在此测试期间,在 BizTalk 或 SQL Server 应用程序日志中未生成任何错误。则可以得出以下结论:
· 在我们的系统中没有明显的资源瓶颈。
· 所有这些指标均处于运行状况良好的范围内。
· CPU 和磁盘空闲时间显示存在大量余量,甚至没有接近限定标准。
· SQL 锁指标正常,在达到约 5000 左右(根据您的 SQL Server)之前 Lock Timeouts/sec 未出现问题,并且锁定等待时间在 1 秒以下也很正常。
作者: ttggl 时间: 2009-5-25 15:08
BizTalk开发系列(二十四) BizTalk项目框架建议。
Asp.NET有MVC框架,大部份的开发都是按照MVC进行的。BizTalk是面向消息的开发,不能完全采用分层的开发模式。而微软只提供了BizTalk项目开发的基本策略,通过分析相关的Complex项目。还有自己参与的一些BizTalk项目。整理了一下在BizTalk项目框架的建议。
基本原则
对于系统建立一个总体的解决方案。
使用VSTS或VSS 对解决方案进行管理(以下是说明指的是在VSTS的环境下创建解决方案)。
统一开发人员的本地项目目录结构。
将较大的项目拆分为较小的几个项目,(单独DLL大小不超过10M)。
使用统一的测试数据。
文件夹和项目规划
将总体的解决方案根据架构设计分使用文件夹分为不同的区域,例如:BizTalk Applications, Components, Public, Web Applications , WinForm Applications等。在创建解决方案文件夹时要在解决方案的物理文件夹上创建相同的文件夹)。
1. BizTalk Applications子文件夹
Pipelines, Pipeline跟其他项目关系不紧密,强烈建议单独列为一个文件夹。优先使用自己定义的Pipeline。如果系统自带的Pipeline已经有此功能,为了以后修改的方便(新增或删减功能)也建议使用自己创建的Pipeline。
Orchestrations
Maps
Schemas
Exception(如果有提供异常解决方案)
2. Components 子文件夹
Utility 用于创建公共方法或操作
Entity 用于创建实体类
BusinessProcess 用于特定业务需求
3. Public 子文件夹
Keys 用于存放解决方案的Key,最好只用一个。
TestData/Msgs 用于存放Schema生成的实例,还可以用于存放测试数据.
Config 用于存放配置文件或绑定文件。
项目初始化配置
配置安装服务器时使用LOCALHOST或"."(点号)。点号的速度比LOCALHOST快。
配置密钥时使用相对路径。
设置相应的Application Name
注意在配置选项菜单选择所有配置。
对于BizTalk调用的自定义的程序集在部署的时候是需要安装到GAC里的。此时最好用命令将自定义的组件通过生成后事件将其安装到GAC中。
"C
rogramFilesMicrosoftVisualStudio8SDKv2.0Bingacutil.exe"/i"$(TargetPath)"/F
解决方案目录:
系统文件夹目录

作者: ttggl 时间: 2009-5-25 15:09
BizTalk开发系列(二十五) SQL Adapter
SQL Server 是.NET开发的首选数据库。当然开发BizTalk应用程序很多也离不了SQL Server.针对SQLServer的数据操作BizTalk 提供了SQLAdapter作为与数据库交互的接口。本文是一篇基础文章,一部分内容摘自BizTalk的帮助文档。主要介绍了在SQLAdapter使用过程中需要了解或掌握的相关知识。如果您已经很了解BizTalk开发的话欢迎作补充。 SQL适配器由接收和发送适配器组成。 SQL 接收适配器是定期轮询 SQL 结果集的轮询适配器。SQL命令存储在接收位置的配置属性中,可通过适配器架构生成向导程序调用。SQL 接收适配器支持每次运行返回单个 XML 数据格式结果集的SELECT语句和存储过程调用。
SQL 发送适配器,可以将动态创建的 Updategram 或动态调用的存储过程发送到 SQLServer。Updategram 为 XML 片段,用于根据数据库表和列来映射 XML 节点从而在 SQL Server数据库中插入、更新或删除数据。在 Updategram 完成后,SQL Server将返回可选的响应文档,其中包含状态信息以指明更新是否成功。如果在更新期间出现错误,则 SQL 适配器将引发由 BizTalk消息引擎处理的异常。如果将 SQL 发送适配器配置为调用存储过程,则该适配器将以单一 XML 格式的记录集形式返回所有结果。
SQL架构生成向导
新建BizTalk项目,添加生成项目。
在生成适配器的列表中选择SQL.
在数据库连接属性设置中。如果是使用数据库账户登录的话需要选择Allow saving password。否则不能通过向导。
作者: ttggl 时间: 2009-5-25 15:11
在架构信息中的目标命名空间中输入命名空间,端口类型中选择接收或发送端口。发送端口需要输入返回消息的根节点名称。
在输入的SQL脚本需要使用for xml auto 或for xml auto, elements将结果以XML记录集的形式返回。
还可以选择存储过程。在存储过程列表中选择存储过程名称并在表格中给存储参数赋值。参数赋值的时候需要耐心点,不然一不小心就选择NULL了。
完成之后向导生成器就会自动生成Schema。同时也会生成带有该Schema类型的Orchestration。在Orchestration中使用Schema类型跟其他Schema(自定义或生成)的没有什么区别。这里就不介绍了。
使用 Updategram
作者: ttggl 时间: 2009-5-25 15:12
通过使用 updategram ,可以从现有 XML 文档在 Microsoft SQL Server 中修改(插入、更新或删除)数据库。 有关Updategram的详细信息参见: Updategram 简介 (SQLXML 4.0)
所有 Updategram 都包含相同的基本结构:
<InboundRootElementName>
<sync>
<before>
<TableNamecol1='value'col2='value'/>
</before>
<after>
<TableNamecol1='value'col2='value'/>
</after>
</sync>
</InboundRootElementName>
以下定义描述了每个块的角色:
<before>。标识记录实例的现有状态(也称为“之前状态”),并充当 SQL 语句中的 WHERE 子句。
<after>。标识要将数据更改为的新状态。
<sync>。包含 <before> 块和 <after> 块。<sync> 块可以包含多组 <before> 块和 <after> 块。如果存在多组 <before> 块和 <after> 块,则必须成对指定这些块(即使它们为空)。此外,Updategram 可以具有多个 <sync> 块。每个 <sync> 块都是一个事务单元(这意味着 <sync> 中的所有项都在运行,或者都没有运行)。如果在 Updategram 中指定多个 <sync> 块,其中一个 <sync> 块出错将不会影响其他 <sync> 块。
Updategram 是否删除、插入或更新记录实例取决于 <before> 块和 <after> 块的内容:
如果记录实例只出现在 <before> 块中,而在 <after> 块中没有对应的实例,则 Updategram 将执行删除操作。
作者: ttggl 时间: 2009-5-25 15:12
如果记录实例只出现在 <after> 块中,而在 <before> 块中没有对应的实例,则执行插入操作。 如果记录实例出现在 <before> 块中,并在 <after> 块中存在对应的实例,则执行更新操作。在这种情况下,<after> 块中指定的值将更新相应的记录实例。
使用添加生成的项向导,可以选择要对表执行的操作,并生成只支持该操作的架构。例如,如果选择插入操作,则架构中将仅显示 Updategram上的 <before>块。若要生成可用于上述任何操作的多用途架构,请从“要更新的列”列表中选择针对所有列的更新操作。然后,在根据此架构创建 XML实例时可以选择要创建的块。
通过添加生成的项生成的Updategram XML架构。
SQL接收适配器的配置
SQL 接收适配器只能绑定到单向接收端口,在SQL 传输属性对话框中配置需要注意:文档根节点和目标命名空间要跟生成的Schema一致当然你也可以反过来将Schema中的命名空间和根节点调成和Adapter配置的一致再重新部署项目。连接字符串可以通过数据链接属性配置。SQL命令可以根据现有的Schema生成或者手动输入SQL命令或存储过程。
接收配置中的Poll While DataFound属性指定是在存储过程或查询未返回任何结果后才提交其他批,还是在每个轮询间隔提交一个存储过程结果或查询结果。默认为False.指的是在每个轮询间隔提交一个存储过程结果或查询结果。Polling Interval指定轮询请求之间的单位数。Polling Unit ofMeasure 指定轮询请求之间使用的度量单位。
作者: ttggl 时间: 2009-5-25 15:13
最后要介绍一下URI,如果配置的SQL接收端口URI地址与BizTalk现有的一接收端口配置一样的话.端口配置向导会提示该位置已经被使用。但如果你必须要使用这个位置的话则可以手动在UR后面添加I标识来实现。比如:SQL://./pubs/Next
SQL发送适配器的配置
SQL发送适配器的配置比较简单,可以绑定到单向或双向端口。同时注意命名空间、根节点与Schema的一致性。
SQL 适配器的最佳实践
1.优先使用存储过程,对于偶尔执行的操作可以也使用updategram 。
2.避免在接收端口中因重新提交相同数据而产生竞争。最好是在表中设置一个状态字段,以防止在长时间执行业务流程时 SQL 操作向 BizTalk Server 重新发送相同的信息。
3.使用信封消息每次返回多行。SQL 适配器接收函数将限定为只能每分钟处理 60 条消息。
4.如果消息大于 1 MB,则应考虑减少从 SQL Server 返回的行数,以使消息保持在 1 MB 以下。同时建议将连续轮询属性设置为True,以便适配器在单独的批中只提交剩余的行。适配器提交批,直到 SQL Server 计算机返回空的结果集,此时 SQL适配器将释放线程,直到下一个轮询间隔。
SQL 适配器已知问题和解决办法
1.接收函数返回空文档
如果 SELECT 语句或存储过程生成空结果集,则 SQL 适配器接收函数返回的文档只包含根和目标命名空间。
作者: ttggl 时间: 2009-5-25 15:13
如果 SELECT 语句或存储过程包含 xmldata 关键字,就会出现此问题。
若要解决此问题,请删除 SQL 适配器终结点配置中 SELECT 语句或存储过程中的 xmldata 关键字。
2.向 SQL 发送适配器发送 updategram 时收到错误
向 SQL 发送适配器发送 updategram 时,可能会出现接收错误消息“从字符串向 datetime 转换时出现语法错误”。
如果 SQL 表包含日期时间列,并且 updategram 尝试用不正确的值更新该列,则会出现此问题。
若要解决此问题,请不要使用 BizTalk 映射器 functoid 创建要映射到 updategram 的日期时间值。这些 functoid 创建的日期时间值的格式为“1999-05-31T13:20:00.000-05:00”。SQL 日期时间列需要的日期时间值的格式为“1999-05-31T13:20:00.000”。请通过调用 DateTime 类的 Parse 或 ParseExact 方法,而不使用默认的日期和时间 functoid 来手动创建日期时间值。
3.在 updategram 中使用 money 数据类型列
在 SQL 适配器的添加生成的项向导生成一个 updategram 架构时,该向导会在架构中将 money 数据类型列表示为 XSD 类型 decimal。
发生此问题的原因是 SQLXML 要求 updategram 以“$123.45”的格式来传递 money 列。
若要在 updategram 中使用 money 列,请将 updategram 架构中对应于 SQL Server 中 money 列的属性从 xs:decimal 类型更改为 xs:string 类型。将数据映射到此列时,记住要包括前导美元符号。
4.编译错误:‘name’属性值无效
生成项目时,收到编译错误“‘name’属性值无效: 名称不能以 '' 字符(十六进制值 <十六进制值>)开头。file:/<文件位置>.xsd 发生错误。”。
作者: ttggl 时间: 2009-5-25 15:14
如果 SELECT 语句或存储过程遇到要导入到添加适配器向导的非法字符(如 System.Xml.XmlConvert 类中所述),就会出现此问题。
若要纠正此错误,请修改添加适配器向导中定义的 SELECT 语句或存储过程中列出的表名称或列名称,使这些名称包含 System.Xml.XmlConvert 类所定义的合法值。有关 XmlConvert 类支持的字符的详细信息,请参阅 .NET Framework 文档中的 XmlConvert 类。
5.生成的 XML 架构中缺少列
由添加适配器向导所生成的 XML 架构中缺少列。
如果添加适配器向导无法匹配 XSD 数据类型,就会出现此问题。
若要解决此问题,请将列类型 SQL_Variant 更改为支持的数据类型。
6.SQL 传输架构生成向导在 BizTalk Server 中意外关闭
问题: 在 BizTalk Server 2006 中,尝试为 SQL 适配器发送端口生成架构时,SQL 传输架构生成向导意外关闭。如果尝试为以下 updategram 之一生成架构以更新 SQL Server 2005 中的数据库表时,就会出现此问题:
插入 updategram
更新 updategram
删除 updategram
此外,可能会收到类似以下内容的错误消息:
FailedtoexecuteSQLStatement.Pleaseensurethatthesuppliedsyntaxiscorrect.Newtransactioncannotenlistinthespecifiedtransactioncoordinator.
在 SQL Server 2005 中使用 SQL 传输架构生成向导查询数据库表时,可能会收到此错误消息。
原因:
当数据库表中包含以下一种数据类型的列时,就会出现此问题:
varbinary(MAX) 数据类型
varchar(MAX) 数据类型
nvarchar(MAX) 数据类型
xml 数据类型
在 BizTalk Server 中,SQL 适配器不支持这些数据类型。
解决方法:
这些数据类型是 SQL Server 2005 中新增的数据类型。当数据库表中包含其中一种数据类型的列时,请不要在 BizTalk Server 中使用 SQL 适配器向数据库表中插入数据。另外,不要在 BizTalk Server 中使用 SQL 适配器从数据库表中检索数据。
作者: ttggl 时间: 2009-5-25 15:15
BizTalk开发系列(二十六) 使用Web Service 本文示例源代码或素材下载 WebService是在构建SOA平台中广泛使用的技术。在BizTalk开发过程中使用SOAP适配器接收和发送 Web Services请求。业务流程可以发布为 Web Services 并使用外部 Web Services。由于WebService是基于Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等内容比较丰富。这里仅探讨在BizTalk中如何使用Web Service。
如下图所示,我们构造了这样一个场景:数据库中存储Addressbook表。我们通过BizTalk将发布Web Service接收添加数据到数据库表中。如果在数据库操作成功的话则返回受影响的行数。如是失败的话则返回异常信息。
在设计流程过程中,需要添加异常捕获形状接收在数据库操作过程中产生的异常信息。将错误信息借助双向端口的Fault Port将异常信息返回给请求系统。注意在异常处理模块中结束流程,否则会产生错误:
mustreceivebeforesendingamessagewhosemessagetypecorrespondstoarequestreponseoperationonanimplementedport
发布架构为Web Services
BizTalk设计器通过使用BizTalk Web Services发布向导将流程或架构发布为Web Service.MSDN推荐仅将架构发布为Web Service。“如果您想要更详细的解释,那就是松散耦合!这样做使您在更改业务流程时具有更大的自由性,无需中断调用方。”。 虽然不是很赞成松散耦合这个观点,因为通过比较两种方式发布出来的WebServcie最终都是通过注入的方式调用全局缓存的流程类库。
作者: ttggl 时间: 2009-5-25 15:15
但是还是建议仅将架构发布为Web Service。因为如果仅将架构发布为Web Service的话生成的Web Service项目仅在需要使用的Schema.但如果将流程发布为Web Services的话可能一些其他的架构也会暴露在WebServices的项目中。比如上图所示的流程(Schema和流程在一个同项目文件中)中如果使用发布流程的话则在流程中使用的添加数据的架构也会暴露在Web Service中。这样是不太安全的因为数据库操作的架构包含存储过程名称,参数及类型之类的信息。
[通过发布架构产生的Web Service]
[通过发布流程产生的Web Service]
当然直接选择发布流程的话就不需要设置方法和参数名等信息简化了发布的过程。选择哪种方式可以看实际情况而定。
讨论了两种发布方式的区别下面提示Step by Step的方式发布架构为Web Service。
1.在Visual Studio开发环境的工具栏下找到BizTalk Web Service发布向导,或者可以在开始-程序-Microsoft BizTalk Server 2006目录下找到BizTalk Web Service发布向导。
2.在创建 Web Service 页面下选择发布架构为向导。发布流程的方式比较简单将在之后讨论。
作者: ttggl 时间: 2009-5-25 15:16
3.在Web Service定义页面。可以分别对这些节点命名。当然还可以根据实际需要对其项目进行添加、删除、修改等操作。注意方法名称应该与Orchestration设计过程中使用的端口的操作名称一致。
4.输入目标命名空间,这个命名空间是在SOAP请求消息中使用的。所以可以不跟架构中使用的消息一致。
5.选择发布位置,这里的名称是虚拟目录的名称。如果有旧版本的相同名称的话需要选择覆盖安装。另外选择访问方式和为BizTalk程序创建接收位置。
6. 至此将架构发布成了Web Service.窗口中提示的路径是Web Service项目保存的路径。可以直接打开项目源码,(但最好不要做改动,如果不是很熟悉的话。)

同时可以在IIS里查看到新添加的虚拟目录

作者: ttggl 时间: 2009-5-25 15:16
发布流程为Web Service 1. 发布流程为Web Service的过程比较简单,接上面第2步开始选择发布流程为Web Service。
2. 建议在Visual Studio中使用工具菜单下的Web Services发布向导,这样这一步就可以直接定义到项目中的动态库。
3.选择需要发布的流程和端口。
4.后续的部署跟上面是一致的。可以从第4步开始设置。
BizTalk Application绑定相应的Web Service。
这一过程比较简单,如果在发布向导的时候已经选择了为应用程序产生接口的话直接在应用程序配置窗口选择相应的接收位置即可。

BizTalk消费Web Service.
在BizTalk的应用程序中引用Web Service的方法跟一般的.NET应用程序类似。
1.在BizTalk应用程序中添加Web引用

作者: ttggl 时间: 2009-5-25 15:17
2.选择本地计算机上的Web服务,在列表中选择相应的服务。添加相应的名称之后可以在类型窗口查看到相应的端口类型和消息类型。
3.在流程中创建消息时选择对应的Web Message Types。创建端口时也同样使用已经存在的端口类型,即引用Web Services创建的端口类型。
4.项目部署之后,在配置端口时选择类型为SOAP,在配置页面输入Web Service路径。
Web Services的测试
在.NET开发 Web Services的过程中常常会采用页面输入的方式对Web Service进行测试。但是BizTalk生成的Web Service项目已经在Web.Config配置文件中禁止HTTP GET和HTTP POST方法。因此需要通过使用XMLSpy或SoapUI等工具对Web Service进行测试。
我们来测试本次Sample的场景,在SOAPUI中新建一个Project。在请求参数中将“?”更改为相应的数值。发送请求,则返回受影响的行数。测试结果跟预期的一致。
另外,由于我们需要测试返回错误消息的情况因此在数据库中将名称字段设为主键。然后根据发送相同的请求参数返回错误信息。请注意,红线部分是在异常处理模块里通过字符串构造的方法添加的。
总结
经过以上的探讨基本上涵盖了SOAP Adapter的基本应用。
出处 : http://www.cnblogs.com/cbcye/archive/2008/11/13/1332444.html
作者: ttggl 时间: 2009-5-25 15:17
BizTalk开发系列(二十七) 异常管理中的数据编码。
在BizTalk的异常管理解决方案中。大部分是通过订阅相关的升级属性来接收消息,并在自定义的流程或发送端口进行处理。但不管怎样,一般会定义统一的错误消息Schema,这样不仅可以让我们通过异常信息快速的查找错误。还可以方便的跟不同的系统或存储方式做映射。
虽然在BizTalk内部唯一使用Xml文档,但BizTalk所能接受的消息不单单只有XML文档。RAR,ZIP,WMA,WMV等等都是 BizTalk可以接收的消息。这就给BizTalk的异常管理造成了一定的麻烦,因为原消息一般会包含到统一的异常消息里。如果消息在产生异常之前就已经被拆装为相应的XML文档的话则可以很方便的借用XMLDocument对像的OuterXML属性获得原消息的消息体。但是如果消息是在 Adapter或pipeline出错的话则可能消息往往还没有被处理成XML。
在捕获异常消息的时候通常将使用XMLDocument对像进行捕获,但如果直接使用XMLDocumentObject.OuterXML属性获取消息的话则会产生类似如下的错误:
Dataattherootlevelisinvalid.Line1,position1Excepion
因些需要对异常消息进行重新编码。在BizTalk中的所有消息都是XLANGMessage类型的。XLANGMessage类提供与不同数据类型进行转换的功能。如下代码所示,我们先将消息转为Stream,再从Stream专为 String类型。这样我们就可以得到消息的文本内容了。
public static string GetMsgSourceString(XLANGMessage message)
{
string sourceString = string.Empty;
Stream sourceStream = null;
StreamReader streamReader = null;
try
{
sourceStream = (Stream)message[0].RetrieveAs(typeof(Stream));
streamReader = new StreamReader(sourceStream,Encoding.UTF8);
sourceString = streamReader.ReadToEnd();
return sourceString;
}
catch (System.Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("CBCYE.Exception", "Failure to get source from message :" + message.Name, System.Diagnostics.EventLogEntryType.Error);
return sourceString;
}
finally
{
if (null != sourceString)
{
sourceString = null;
}
if (null != sourceStream)
{
sourceStream = null;
}
if (null != streamReader)
{
streamReader = null;
}
}
}
作者: ttggl 时间: 2009-5-25 15:18
BizTalk开发系列(二十七) 异常管理中的数据编码。


但如果原消息是RAR,ZIP等格式的数据话就又不一样了。虽然通过该方法也可以进行编码。但是你看到会是类似下面图的数据(ZIP文件转成String的效果)。文档中有乱码不方便保存和阅读而且很容易使数据无法恢复。
不过问题总会有解决办法的,我们可以使用在Internet中应用非常广泛的Base64编码[1]将数据进行重新编码。在C#中可以使用Convert.ToBase64String与Convert.FromBase64String实现byte[]与string(Base64编码)之间的转换。
public static string GetMsgSourceBase64(XLANGMessage message)
{
string sourceString = string.Empty;
Stream sourceStream = null;
StreamReader streamReader = null;
byte[] buffer = null;
try
{
sourceStream = (Stream)message[0].RetrieveAs(typeof(Stream));
streamReader = new StreamReader(sourceStream, Encoding.UTF8);
sourceString = streamReader.ReadToEnd();
System.Text.ASCIIEncoding accessEncoding = new ASCIIEncoding();
buffer = accessEncoding.GetBytes(sourceString);
sourceString = Convert.ToBase64String(buffer);
return sourceString;
}
catch (System.Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("CBCYE.Exception","Failure to get source from message :" + message.Name,System.Diagnostics.EventLogEntryType.Error);
return sourceString;
}
finally
{
if (null != sourceString)
{
sourceString = null;
}
if (null != sourceStream)
{
sourceStream = null;
}
if (null != streamReader)
{
streamReader = null;
}
if (null != buffer)
{
buffer = null;
}
}
}
经过转换之后同样的Zip文件在文本中存储的数据变成了下图所示.这样的ASCII码字符就不用担心是用Unicode还是UTF-8编码存储。现在绝大多数的语言都是支持Base64的加密与解密的。因此查看与还原原消息也变得很简单了。

最后关于怎么存储异常消息体可以看具体的需求,如果BizTalk接收和发送的的就都是FormattedXML的话就不需要编码了,如果还有Txt,CSV之类的平面的文件的话可以直接返回String,方便查看。最后如果是比较复杂的集成环境就需要使用Base64对数据进行统一编码。还可以使用InfoPath等客户端软件来实现异常管理平台。
[1] Base64是一种使用64基的位置计数法。它使用2的最大次方来代表仅可打印的ASCII字符。这使它可用来作为电子邮件的传输编码。在Base64中的变量使用字符A-Z、a-z和0-9,这样共有62个字符,用来作为开始的64个数字,最后两个用来作为数字的符号在不同的系统中而不同。
作者: ttggl 时间: 2009-5-25 15:19
BizTalk开发系列(二十八) MSMQ 适配器。
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。BizTalk Server 使用MSMQ Adapter向MSMQ发送以及从其接收消息。MSMQ 适配器支持 Message Queuing 2.0 和 Message Queuing 3.0。本文简要的介绍MSMQ的相关概念,演示如何使用MSMQ适配器向发送和接收其消息。最后阐述在使用MSMQ Adapter适配器的相关问题及相关解决办法。
1. MSMQ相关概念
Message 是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
队列类型
有两种主要类别的队列:由您或网络中的其他用户创建的队列和系统队列。用户创建的队列可能是以下任何一种队列:
“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。
“专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。
“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。
“响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。
系统生成的队列一般分为以下几类:
“日记队列”可选地存储发送消息的副本和从队列中移除的消息副本。每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。
“死信队列”存储无法传递或已过期的消息的副本。如果过期消息或无法传递的消息是事务性消息,则被存储在一种特殊的名为“事务性死信队列”的死信队列中。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息,
“报告队列”包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。每台计算机上只能有一个报告队列。
“专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。
在应用程序中进行的大多数工作都涉及访问公共队列及其消息。但是,根据应用程序的日记记录、确认和其他特殊处理需要,在日常操作中很可能要使用几种不同的系统队列。
同步和异步通信
队列通信在本质上是“异步”的,因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外,还可以异步执行接收操作。希望接收消息的用户可以针对任何给定的队列调用 BeginReceive 方法,然后立即执行其他任务,而无需等待回复。这与人们所了解的“同步通信”截然不同。
在同步通信中,请求的发送方在执行其他任务前,必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间。
作者: ttggl 时间: 2009-5-25 15:20
2. 安装和创建消息队列 消息队列服务属于Windows组件,安装时可以在添加/删除程序的 添加/删除Windows组件里找到消息队列组件(有些功能是需要在域环境下才可以安装和使用)。如下图:
安装完MSMQ之后在计算机管理中的服务与应用程序里找到消息队列服务。如果计算机在WorkGroup模式下只能创建私有队列。
3. 演示:MSMQ Adapter
本演示模拟从文件到消息队列和消息队列到文件的两种场景。分别应用到了MSMQ的接收和发送适配器。本演示没有使用到Orchestration,通过Public/Subscribe机制将发送和接收端口串联起来。演示步骤可以参考《BizTalk开发系列(一) "Hello World" 》
创建专用队列
创建消息队列非常简单,在专用队列中右击选择New.在打开的窗口中输入队列的名称。如果需要支持事务的话则选择事务。默认情况下MSMQ的存储位置为:C:WINDOWSsystem32msmqstorage。可以通过更改消息队列的属性进行更改。
创建完毕之后可以在专用队列中打到相应的队列。
MSMQ发送适配器
MSMQ发送适配器的属性比较多,功能很强大。但配置也不是很复杂。比如一般情况下只需要设置目标队列属性即可。但如果你在创建消息队列时选择了事务那么也需要在发送适配器中选择事务。下图是本演示的配置。设置目标队列时只需要输入:“CBCYEPRIVATE$DEMO”。图中显示的格式为转换后的格式。 
作者: ttggl 时间: 2009-5-25 15:20
MSDN中关于MSMQ发送适配器属性说明
| 属性 | 操作 | 数据类型 | 默认值 |
| 密码 | 指定远程队列的密码。与“用户名”一起使用。 | 字符串 | 空 |
| 用户名 | 指定远程队列的用户名。与“密码”一起使用。不能使用远程计算机的本地用户作为该用户名。 | 字符串 | 空 |
| 确认类型 | 指定消息队列返回给发送方应用程序的确认消息的类型。您可以选择多个确认类型。System.Messaging.AcknowledgeTypes 枚举中的所有确认类型都可用。 | 字符串 | 无 |
| 管理队列 | 指定接收确认消息的队列的名称。 | 字符串 | 空 |
| 正文类型 | 指定 MSMQ 中的消息正文类型。有效值为 .NET VarEnum 枚举的成员。 | Int | 8209 |
| 证书指纹 | 指定用于消息验证的证书的指纹。此属性与“使用验证”属性结合使用,对消息进行验证。使用“用户名”和“密码”属性可以访问队列。 | 字符串 | 空 |
| 目标队列 | 指定目标队列。 (注意:发送端口或接收位置的 URI 不能超过 256 个字符。 ) | 字符串 | 空 |
| 加密算法 | 对于加密算法,请选择“RC2”、“RC4”或“无”。 | Enum | 无 |
| 最大消息大小(KB) | 指定发送给所指定队列的消息的最大大小。 | UnsignedInt | 1024 |
| 消息优先级 | 设置消息优先级。 | Enum | 正常 |
| 可恢复 | 指定是否确保消息的可恢复性。 | Boolean | False |
| 支持分段 | 如果将此布尔属性的值设置为 True,则会对大于 4 MB 的消息分段。 | Boolean | False |
| 超时 | 指定等待消息到达目标队列的最长时间。只有当使用事务时才适用。 | Int | 0 |
| 超时单位 | 设置用于“超时”属性的单位。 选择“天”、“小时”、“分钟”或“秒”。 | Enum | 天 |
| 事务性 | 如果将此值设置为 True,则会在您使用事务时发送消息。 | Boolean | False |
| 使用验证 | 如果将此布尔属性的值设置为 True,则会控制验证。此属性与“证书指纹”属性结合使用,对消息进行验证。使用“用户名”和“密码”属性可以访问队列。 | Boolean | False |
| 使用死信队列 | 如果将此值设置为 True,则会在出错时向死信队列发送消息。 | Boolean | True |
| 使用日志队列 | 如果将此值设置为 True,则会在处理消息时保存消息的副本。 | Boolean | False |
测试
将测试数据放到文件夹。BizTalk会将它路由到MSMQ Adapter并将它发送到MSMQ中。你可以在计算机管理中的消息队列窗口中看到消息.则表明发送成功。
MSMQ接收适配器
相对来说MSMQ接收适配器的配置就简单很多,只需要配置一下消息队列路径即可。
·MSDN中关于MSMQ发送适配器属性说明
| 区域 | 操作 | 日期类型 | 默认值 |
| 密码 | 设置用于远程队列的密码。 | 字符串 | 空 |
| 用户名 | 确定与密码结合使用以访问远程队列的用户名。不能使用远程计算机的本地用户作为该用户名。 | 字符串 | 空 |
| 批大小 | 配置批大小。MSMQ 适配器将消息分批提交给 MessageBox 数据库。默认的批大小为 20,最小批大小为 1。 注意:如果接收位置的“事务性”属性设置为 True;则各个消息批将在 Microsoft 分布式事务处理协调器 (MSDTC)事务的上下文中提交给 MessageBox 数据库。为消息创建的 MSDTC 事务将始终处于打开状态,直到该批中的所有消息都已保存到MessageBox 数据库并已放置到相应的订户队列中为止。因此,MSDTC事务的持续时间会随着“批大小”参数的增大而增长。由于同时打开大量的 MSDTC事务会降低总体性能,因此在启用事务支持时,“批大小”参数不应设置为太大的值。 | Int | 20 |
| 失败时 | 指定适配器响应错误的方式。将此属性设置为以下值之一: o 停止。如果发生错误,则停止通过此接收位置接收消息。 o 已挂起(不可恢复)。挂起消息并将其标记为不可恢复。 o 已挂起(可恢复)。挂起消息并将其标记为可恢复。 重要说明 如果同时应用“按序处理”属性的“True”选项、“失败时”属性的“停止”选项以及“事务性”属性的“False”选项,则不会挂起送达失败的任何消息或将其保留在源队列中。在此方案中,会发生消息丢失。若要防止消息丢失,在使用“按序处理”功能时,只在应用“事务性”属性的“True”选项时才应用“失败时”属性的“停止”选项。然后,在消息送达失败时,原始消息将会保留在源 MSMQ 队列中。 如果“按序处理”属性的值设为“False”,则“失败时”属性将不起作用,并且如果消息送达失败,则消息将以“已挂起(可恢复)”的状态挂起。 | String | 已挂起(可恢复) |
| 按序处理 | 将此属性设置为 True 或 False。这表示是否按顺序处理消息。在与已将“按序送达”选项设置为 True 的 BizTalk 消息传送或业务流程发送端口一起使用时,将该属性设置为 True 表示允许按序送达消息。 | Boolean | False |
| 队列 | 键入有效的队列路径。根据指定的队列路径,系统将执行相应的验证。 注意: 发送端口或接收位置的 URI 不能超过 256 个字符。 注意: MSMQ 接收适配器使用轮询机制每隔 0.5 秒对为新消息指定的 MSMQ 队列进行监视。此 0.5 秒间隔为固定间隔。 | 字符串 | 空 |
| 事务性 | 将此属性设置为 True 或 False。 注意: 该适配器不支持对远程队列进行事务性读取。 | Boolean | False |
作者: ttggl 时间: 2009-5-25 15:20
测试 MSMQ接收Adapter的轮询时间为0.5秒。根据配置MSMQ接收适配器会从MSMQ从接收消息。BizTalk将消息路由到文件适配器发送端口。如下图所示可以查看到相应的文件信息:
4. MSMQ 适配器相关问题及解决办法[陆续更新]
错误信息: The specified destination queue"FORMATNAME
IRECT=OS:CBCYEPRIVATE$DEMO" is transactional, and themessage is being sent is non-transaction.
解决办法:
在发送适配器属性中将发送端口的事务类型改为True.
错误信息:BizTalk message 6eeed3d2-bd04-48c3-a544-22692eb13121 with size7089.970703125 KB cannot be sent because the configured message size is1024 KB.
原因:消息队列适配器默认消息大小为1M,但发送的数据为7M.另外Windows消息队列默认最大消息为4M.
解决办法:更改适配器的最大消息大于当前的文件大小,并启用消息队列适配器的消息分段功能。下图为启用分段功能之后7M消息被拆分的情况。 在MSMQ接收适配器会将此消息合并为一个消息。发布到Messagebox.
错误信息:
The user does not have permissions to send messages.
或者
The adapter "MSMQ" raised an error message. Details "The user does not have permissions to receive messages.
Please check the queue permissions. ".
原因:BizTalk的当前用户对消息队列没有写入或读取的权限
解决办法:在消息队列属性的安全选项中选择相应用户的权限
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-25 15:21
BizTalk开发系列(二十九) 宏的使用。
在BizTalk中可以使用宏**动态的让BizTalk发送处理程序使用单独的值来替换宏。常用的使用宏的发送程序有:文件发送适配器和SMTP发送适配器。在表达式中可以使用同时使用多个宏。例如:在文件发送适配器的文件名中使用%SourceFileName%_%datetime%_%MessageID%.xml则表达用“_”连接的三个宏值。
使用宏的注意事项
如果存在以下任何一种情况,发送处理程序将不会使用值替换宏:
未设置相应的系统属性。
宏拼写错误。
宏的值所包含的符号在文件名中无效。
如果出现上述任何情况,发送处理程序都会将宏保持不变,例如 Myfile_%MessageID%.xml。
文件适配器中可以使用宏的列表
| 宏名称 | 替代值 | ||
| %datetime% | YYYY-MM-DDThhmmss 格式的世界时 (UTC) 日期时间(例如 1997-07-12T103508)。 | ||
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | ||
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | ||
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | ||
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | ||
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值直接来自消息上下文属性 BTS.MessageID。 | ||
| %SourceFileName% | 文件适配器从中读取消息的文件的名称。文件名包括扩展名,但不包括文件路径,例如 Sample.xml。在替代此属性时,文件适配器从FILE.ReceivedFileName上下文属性中存储的绝对文件路径提取文件名。如果上下文属性没有值(例如,如果消息是在文件适配器之外的其他适配器上接收到的),则将不替代该宏,并在文件名中按原样保留该宏(例如 C rop%SourceFileName%)。
| ||
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。
| ||
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。
| ||
| %time% | hhmmss 格式的 UTC 时间。 | ||
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 |
SMTP适配器中支持的宏
| 宏 | 说明 | 用于与“收件人”一起使用 | 用于与“抄送”一起使用 | 用于与“主题”一起使用 |
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值来自消息上下文属性 BTS.MessageID。 | 否 | 否 | 是 |
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | 否 | 否 | 是 |
| %datetime% | YYYY-MM-DDThhmmss 格式的 UTC 日期时间(例如 1997-07-12T103508)。 | 否 | 否 | 是 |
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | 否 | 否 | 是 |
| %time% | hhmmss 格式的 UTC 时间。 | 否 | 否 | 是 |
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 | 否 | 否 | 是 |
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。 | 是 | 是 | 是 |
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。 | 是 | 是 | 是 |
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | 是 | 是 | 是 |
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | 是 | 是 | 是 |
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-26 11:33
BizTalk开发系列(二十九) 宏的使用。
在BizTalk中可以使用宏**动态的让BizTalk发送处理程序使用单独的值来替换宏。常用的使用宏的发送程序有:文件发送适配器和SMTP发送适配器。在表达式中可以使用同时使用多个宏。例如:在文件发送适配器的文件名中使用%SourceFileName%_%datetime%_%MessageID%.xml则表达用“_”连接的三个宏值。
使用宏的注意事项
如果存在以下任何一种情况,发送处理程序将不会使用值替换宏:
未设置相应的系统属性。
宏拼写错误。
宏的值所包含的符号在文件名中无效。
如果出现上述任何情况,发送处理程序都会将宏保持不变,例如 Myfile_%MessageID%.xml。
文件适配器中可以使用宏的列表
| 宏名称 | 替代值 | ||
| %datetime% | YYYY-MM-DDThhmmss 格式的世界时 (UTC) 日期时间(例如 1997-07-12T103508)。 | ||
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | ||
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | ||
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | ||
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | ||
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值直接来自消息上下文属性 BTS.MessageID。 | ||
| %SourceFileName% | 文件适配器从中读取消息的文件的名称。文件名包括扩展名,但不包括文件路径,例如 Sample.xml。在替代此属性时,文件适配器从FILE.ReceivedFileName上下文属性中存储的绝对文件路径提取文件名。如果上下文属性没有值(例如,如果消息是在文件适配器之外的其他适配器上接收到的),则将不替代该宏,并在文件名中按原样保留该宏(例如 C rop%SourceFileName%)。
| ||
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。
| ||
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。
| ||
| %time% | hhmmss 格式的 UTC 时间。 | ||
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 |
SMTP适配器中支持的宏
| 宏 | 说明 | 用于与“收件人”一起使用 | 用于与“抄送”一起使用 | 用于与“主题”一起使用 |
| %MessageID% | BizTalk Server 中消息的全局唯一标识符 (GUID)。该值来自消息上下文属性 BTS.MessageID。 | 否 | 否 | 是 |
| %datetime_bts2000% | YYYYMMDDhhmmsss 格式的 UTC 日期时间,其中,sss 表示秒和毫秒(例如,199707121035234 表示 1997/07/12 10:35:23 和 400 毫秒)。 | 否 | 否 | 是 |
| %datetime% | YYYY-MM-DDThhmmss 格式的 UTC 日期时间(例如 1997-07-12T103508)。 | 否 | 否 | 是 |
| %datetime.tz% | 本地日期时间加上 GMT 时区,格式为 YYYY-MM-DDThhmmssTZD(例如 1997-07-12T103508+800)。 | 否 | 否 | 是 |
| %time% | hhmmss 格式的 UTC 时间。 | 否 | 否 | 是 |
| %time.tz% | 本地时间加上 GMT 时区,格式为 hhmmssTZD(例如 124525+530)。 | 否 | 否 | 是 |
| %SourceParty% | 文件适配器从其接收消息的源参与方的名称。 | 是 | 是 | 是 |
| %SourcePartyQualifier% | 文件适配器从其接收消息的源参与方的限定符。 | 是 | 是 | 是 |
| %DestinationParty% | 目标参与方的名称。该值来自消息上下文属性 BTS.DestinationParty。 | 是 | 是 | 是 |
| %DestinationPartyQualifier% | 目标参与方的限定符。该值来自消息上下文属性 BTS.DestinationPartyQualifier。 | 是 | 是 | 是 |
来源:博客园 作者:Gary Zhang
作者: ttggl 时间: 2009-5-26 11:33
BizTalk开发系列(三十)单向端口实现请求-响应。
BizTalk本质上是异步的消息处理引擎。BizTalk的请求与响应模式是基于异步之上的同步消息交换。消息引擎通过消息的扩展架构链接许多异步消息,消息的相关集关联请求与响应消息。例如,客户端发送一个SOAP请求到BizTalk SOAP适配器。连接该WebService的BizTalkOrchestration接收处理消息。并返回一个SOAP响应消息。对于客户端程序来说是一个同步的SOAP请求。但在引擎内部则是通过并联交换许多的异步消息来实现。
以下是请求-响应模式中的五个架构属性:
BTS.CorrelationToken 允许响应消息路由到请求-响应端口。
BTS.EpmRRCorrelationToken 用于内部的消息引擎指定请求-响应消息流的服务器名称,处理ID和唯一的GUID。
BTS.IsRequestResponse 指定是否是请求-响应消息
BTS.ReqRespTransmitPipelineID
BTS.RouteDirectToTp 用于内部消息引擎允许循环回调请求-响应消息。
基于以上介绍大概了解了双向端口(请求-响应模式)在BizTalk内部的交换原理,我们的想法是通过单向端口来实现双向端口的功能,理论上大体是这样的:创建一个单向端口接收来自Web Service的请求,在Orchestration中通过消息属性订阅消息,Orchestration接到消息之后处理消息,比如创建一个同样的消息(拷贝相应的属性),并修改相应字段的值。新的消息通过发送形状发布到MessageBox中,并初始化相关集。消息引擎根据消息的相关集设置将消息返回给请求与响应端口。
下图是根据理论分析创建的流程图,流程图非常的简单,接收与发送端口都是使用Direct端口类型Receive接收形状使用Filter从Messagebox从MessageBox订阅消息。Send发送形状则是将消息发布到Messagebox。
作者: ttggl 时间: 2009-5-26 11:34
在Construct New Message形状里的表达式语句如下,通过创建新的消息并指定相关集的值。
System.Diagnostics.EventLog.WriteEntry("TwoWayDemo","Begin Process
");
OutMsg = InMsg;
OutMsg(*) = InMsg(*);
OutMsg.Body.Field="cbcye@live.com";
OutMsg.Header.State="Completed";
作者: ttggl 时间: 2009-5-26 11:34
BizTalk开发系列(三十)单向端口实现请求-响应。
OutMsg(BTS.RouteDirectToTP)=true;
System.Diagnostics.EventLog.WriteEntry("TwoWayDemo","Completed Process
");
BizTalk项目部署之后需要将Schema发布为WebService.并在BizTalk应用程序中创建接收端口,由于Orchestration是通过属性订阅消息所以需要在SOAP接收位置中使用XMLReceive Pipeline。最后我们通过soapUI测试WebService可以看到我们的SOAP请求已经的成功的被Orchestration处理并返回处理结果。
总结
以上简单的Demo涉及到的BizTalk相关知识比较多比如发布/订阅机制,相关集,SOAP适配器的使用等。不过理解该Demo相信对于BizTalk的架构领会是一个不小的跨越。最后说明一点这里所指的单向端口是指Orchestration中的单向端口。Web Service发布的端口是双向的。
作者: ttggl 时间: 2009-5-26 11:35
BizTalk开发系列(三十一)配置和使用HTTP适配器。
BizTalk的主机分别进程内主机和**主机。但由于一直使用的是进程内主机,对于**主机的认识比较模糊,前不久在做一个BizTalk的项目的时候,个别系统使用HTTP的方式发布Txt之类的文本的。刚好HTTP适配器与其他的适配器有一点不同就是它的接收适配器是宿主在**主机(IIS)上。在使用的时候需要进行额外的配置。现在我们就来看一下运行于**主机上的HTTP接收适配器的使用,以及运行于进程内主机的发送适配器的使用。
为 HTTP 接收位置配置 IIS
BizTalk主机分为进程内主机和进程外主机,进程内主机是指宿主在BizTalk运行时进程的主机,**主机是指是作为外部进程(如 ISAPI扩展和 ASP.NET)适配器的宿主。因此在配置HTTP接收位置之前需要先配置IIS的BizTalk接收适配器扩展。
1.首先打开IIS管理器,在Web服务扩展中添加一个新的Web服务扩展。
2.在新的Web扩展中输入扩展的名称和位置,BizTalk扩展的位置一般在:C
rogram FilesMicrosoft BizTalkServer 2006HttpReceiveBTSHTTPReceive.dll 。最后选择设置扩展状态为允许。
3.设置完成之后,可以在IIS的Web服务扩展中查看到新添加的扩展。
作者: ttggl 时间: 2009-5-26 11:35
配置接收位置 之前讲到了HTTP适配器是运行于**主机的,因此配置接收位置的时候跟其他适配器有一点不同,也就是除了在BizTalk应用程序里配置之外还需要在**主机(IIS)上进行配置。
1. 在IIS上创建接收位置的位置比较简单,只需要在IIS上创建一个虚拟目录,将目录的地址指向BizTalkHTTP扩展DLL的目录。不过有两点需要注意,一是为发安全起见将虚拟目录的运行模式选择读取和执行,另外如果需要使用隔离级别需要创建一个**的运行池,运行池的帐户要存在于BizTalk Isolated Hosts 和 IIS_WPG组中。并且需要给虚拟目录指定运行池。
为运行池指定用户
为虚拟目录指定运行池
至此您可能会试着去访问此接收位置,由于还未在BizTalk Application中配置接收位置,因此访问时您会收到HTTP 500的错误。不过BizTalk在事件日志中给出了友好的提示,如下。如果在配置或运行过程中出现错误也可以参考这些信息解决。
The BizTalk HTTP receive adapter failed to initialize itself. Possible reasons:
1) Receive location URL is not created/configured correctly.
2) Receive location is not enabled.
3) HTTP receive adapter is not running under a user that has access to management and message databases.
4) Isolated host instance is not created for HTTP Receive adapter.
作者: ttggl 时间: 2009-5-26 11:35
2. 在BizTalk的Application中配置HTTP接收位置。如下图所示,只需要配置虚拟目录地址即可。
测试
在测试之前我们需要创建一个发送端口来接收来自HTTP接收端口发布的消息。HTTP接收适配器支持Get和Post方法的请求。Get方式的测试我们可以直接在URL后面加上问号再加上您要的请求的数据即可。
Post方法我们可以自己写代码,也可以借用第三方的工具。这里使用的是Fiddler。一个很强大的免费的HTTP Debuger工具。
配置发送端口
由于HTTP的发送适配器是运行于进程内主机的因此配置比接收适配器要简单点,只需要配置目标HTTP路径即可(如果安全上的问题)
测试
基于之前创建好的接收位置,我们在HTTP的发送端口端口订阅从HTTP接收适配器发布过来的消息。同时新建一个Aspx的页面。将接收到的请求数据写到日志(测试时使用小量数据)。
System.IO.StreamReader qr = new System.IO.StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
string uriString = qr.ReadToEnd();
if (!string.IsNullOrEmpty(uriString))
{
System.Diagnostics.EventLog.WriteEntry("HTTPDemo", "Content:rn" + uriString);
}
作者: ttggl 时间: 2009-5-26 11:36
发布HTTP请求之后我们可以在日志中查看到相应的记录。
使用HTTP适配器接收Txt之类的文本.
之所以把接收文本提出来是因为HTTP的接收适配器是宿主在IIS上的,需要请求方主动的请求该路径才可以。但有些系统可能它是通过HTTP的方式将文本发布出来的。比如http://www.cbcye.com/demo.txt这样路径。所以不能使用HTTP接收适配器去主动请求Txt.那么这个任务就落在了发送适配器上面,但是发送适配器只支持POST方法,Txt文本是无法通过POST方法得到的。
所以需要创建一个接收代理(Aspx页面),代理的作用是接收发送适配器上的请求,然后通过以下的代码向目标路径获取文本数据,并将数据返回,被发送适配器的接收方法获得。需要注意的是需要将前台页面的代码去除。这样才能将接收到的Txt信息原样的返回。
System.IO.StreamReader qr = new System.IO.StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
string uriString = qr.ReadToEnd();
if (!string.IsNullOrEmpty(uriString))
{
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uriString);
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN;rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.21022)";
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
Response.Write(sr.ReadToEnd());
}
作者: ttggl 时间: 2009-5-26 11:36
BizTalk开发系列(三十二)浅谈BizTalk主机性能优化。
很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率。但默认情况下BizTalk的主机有很多阻止参数会控制 BizTalk对服务器的资源使用率,从而约束了BizTalk的效率。之前做了一个200万条CSV数据通过BizTalk传到数据库的程序。在不改变程序的情况下对主机性能做了一下简单优化,处理效率发生了成倍的增长。
程序逻辑
先简单的介绍一下程序的处理逻辑,CSV原文件大概有200多万条数据,文件大小50多M。每条只有两个字段总长度大概有三十个字符左右。进Pipeline之后由XML Disambler进行拆分,经过Orchestration拆分之后以每个XML 5000条数据进行处理。之后还需要经过其他 Orchestration的订阅与处理。最后将数据存储到SQL Server中。从CSV到SQL Server Table一共需要经过5个变化也就是经过一次拆分和三次Map。
软硬件环境
硬件环境: Intel Xeon E5405 2.00Ghz X2 , 4GB , 74G X 8 RAID 5
软件环境:Windows Server 2003 Enterprise R2 32bit + BizTalk Server 2006 Enterprise R2 32bit + SQL Server 2005 Enterprise R2 32bit
虽然大家可能知道很多方法可以解决这个问题,比如数据库命令,SSIS,自定义Adapter,自定义Pipeline等,但关于程序的优化和合理性我们不在这里讨论因为项目有自己实际的问题,我们主要来看一下在不修改程序的情况下如果通过简单的优化主机性能达到性能的大幅度提高。
在优化之前(使用BizTalk默认设置)虽然我的程序也可以运行,但遇到了两个问题:一个是CPU的利用率很低一般情况下都在20%左右徘徊,磁盘读写效率也不高一般都在20M/s以下。二是数据库的数据不连续,也就是偶尔才会有数据往数据库里添加数据。不是连续的产生数据。所有数据跑完的时间大概需要2小时左右。
作者: ttggl 时间: 2009-5-26 11:36
在优化之前我们需要了解一下两个概念: 主机阻止和CLR 宿主线程值。
主机阻止
在 BizTalk Server 上执行的大部分处理都在称为 BizTalk Server 主机实例的逻辑实体内进行,该逻辑实体是在 BizTalk Server 上以 Windows 服务或**的主机进程运行的进程。为了管理主机实例进程使用的资源,BizTalk Server 使用可调整的阻止机制控制消息在主机实例中的传输和处理。
该阻止机制对主机实例的负载进行调节,以确保负载没有超过主机实例或任何下游主机实例的处理能力。该阻止机制还防止称为资源争用的情况发生,这种情况会降低主机实例进程或其他系统进程的整体性能。一个或多个进程消耗有限的资源从而损害进程自身和/或其他进程时,便会出现资源争用的情况。例如,消耗过量的内存或线程将导致内存分配失败或大量的线程上下文切换,这会影响进程的性能。这样的资源争用会降低 BizTalk Server 的整体性能。
主机阻止机制还检测可用资源利用不足的时间。如果可用的资源未得到充分利用,则阻止机制将允许主机实例处理更多的消息。主机阻止机制不断监视可用资源是否过度利用或利用不足,并据以调整通过主机实例的消息流。
总之,BizTalk Server 主机阻止机制有助于确保系统以最佳可持续水平运行。
主机的CLR 宿主线程值
Windows 线程是 Windows 进程可用的最基本的可执行单元,因此,有必要为与 BizTalk 主机实例相关联的 .NET 线程池分配足够的线程以防止线程不足。线程不足时,没有足够的线程用于执行请求的作业,因此会对性能造成负面影响。同时应注意防止为与主机相关联的 .NET 线程池分配不必要的过多线程。为与主机相关联的 .NET 线程池分配过多的线程会增加上下文切换。Windows 内核从运行一个线程切换到运行另一个线程时,会发生上下文切换,这会带来性能开销。分配过多的线程会产生过多的上下文切换,这会对总体性能产生负面影响。
作者: ttggl 时间: 2009-5-26 11:37
通过在 BizTalk Server 的注册表中创建相应的 CLR Hosting 值,可以修改与 BizTalk 主机的实例相关联的 .NET 线程池中可用的 Windows 线程数。 优化实战
当然对于BizTalk的性能优化是一个复杂的事情。微软也提供也相应的分析工具和指南,但这些实现起来都比较麻烦,而且可能多人都喜欢偷懒,不喜欢看这些分析的数据和使用这些工具。现在我们就来简单的做一下优化,优化主有有几个方面,一个是修改主机的阻止参数,一个是注册表参数的优化(一些高级的功能都藏在注册表里^_^)。
以下是我修改之后的参数设置,各主机阻止参数的含义大家可以通过查看帮助文档(规划可持续性能 > 引擎性能特性 > 通过主机阻止优化资源使用 >如何修改默认的主机阻止设置)了解,有些属性设置为0是指不启用主机阻止,也就是使用服务器最大资源。
1. 主机属性
2.阻止阈值
3.消息发布阻止设置
4. 消息处理阻止设置
作者: ttggl 时间: 2009-5-26 11:38
5.修改.NET宿主线程值 Regedit.exe->HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesBTSSvcguid,其中 guid 是每个 BizTalk Server 主机实例的唯一 GUID
6.调整消息大小阈值
在映射期间,高于此阈值的文档将缓冲到文件系统中。修改该大小阈值,请在 BizTalk Server 注册表的以下位置处创建一个名为 TransformThreshold 的 DWORD 值:
HKLMSoftwareMicrosoftBizTalk Server3.0AdministrationTransformThreshold
输入一个要设置为新阈值的字节数的十进制值: 8000000
优化结果
通过简单的优化之后数据的处理时间从原来的将近2小时缩短到了25分钟左右,服务器的CPU,磁盘读写利用率也得到了大幅度的提高。还有数据库的数据基本上可以连续的产生。
CPU使用率平均在50%左右,有数据存储到SQL Server时会达到90%以上。
磁盘写数据速率达到了52M
总结
性能优化是个复杂的问题,需要经过大量的测试,而且由于项目和环境的需要面对的问题也不一样,程序的瓶颈也不一样。需要按实际情况解决。当然如果在程序设计和开过过程中充分考虑各产品的性能特点,优化程序的架构和处理方式应该是上上策。希望通过本文起到抛砖引玉的作用。大家在性能优化方面有什么经验也可以交流交流。最后声明一下:以上数据仅供参考!
作者: ttggl 时间: 2009-5-26 11:38
BizTalk开发系列(三十三)BizTalk之Excel终极解决方案。
Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapter支持各种协议及应用程序. 不过非常可惜没有提供对富客户端程序Excel的"原生态"支持. 所以我们只能自己查找解决办法。
应用程序对Excel的支持网上已经有很多解决方案的,一部分是使用ODBC的excel驱动将Excel作为数据源进行处理,对于规范数据表之类的Excel文档这种方法比较适用. Karen之前也发布了一个BizTalk Pipeline 的Excel组件 .另外对于复杂类型的Excel文档有一种解决方案是使用Excel API操作Excel单元格进行处理.但是这种方法不能适应快速开发的需求.当客户的Excel模板发生变化的时候就需要编写相应的代码.费时又费力.
那么什么才是好的解决方案呢? 大概列了几项期望:
快速友好的开发方法.
较强的校验功能
保留Excel原有的强大功能.
终端用户良好的体验.
接下来将要请我们的主角上场- “XML 映射”. XML映射允许将自定义的Schema添加到工作薄,提高了对使用本机 XML的支持。这样可以创建一个 XML 映射,用于在导入或导出数据时使数据变得更有意义。也可以导入符合自定义 XML词汇或架构的数据,然后使用相同的Schema将该数据写回去。下图是一张将XML Schema节点与Excel表格关联的截图。
作者: ttggl 时间: 2009-5-26 11:39
了解了XML映射我们以一个案例的形式来更直观的介绍一下在BizTalk在对于Excel的解决方案。我们都知道很多公司都要求新入职的员工要按照公司统一的简历模板重新填写一份个人简历. 下面是一个通过简历模板填写完的Excel文档.我们希望员工通过邮箱或Web Site提交文档.然后通过BizTalk系统将简历信息存储到数据库或者发送到相应的目录。
要实现这样的目标,使用ODBC的Excel驱动肯定是不行的,因为它不是有一个规范的数据表。如果使用API对操作单元格的话开发量又太大。而且如果模板需要变动的话那么还得重新开发程序。有了XML映射我们的过程会简单而且有趣很多。
1.首先我们创建一个Schema文档定义我们需要的节点及其结构。如下图所示。
2. 创建一个Excel文档,为了给终端用户更好的使用体验我们还要对文档增加一些必要的说明和提示。创建完之后加载XMLSchema并且将Schema的节点与文档的单元格关联起来。下图是一个GIF动画,展示了如何将Schema节点与单元格关联起来的过程。
作者: ttggl 时间: 2009-5-26 11:39
3. 到此Excel的模板就制作完成了,我们只需要把这个模板分布给用户就可以了。
4.下面我们就要来在BizTalk服务器上作些开发了。由于BizTalk没有提供对于Excel文档的运行因此我们需要根据ExcelAPI开发一个Pipeline 组件在存储到MessageBox之前将Excel按照XML映射将Excel Stream转为XMLStream. 下图为Excel Component在Receive Pipeline设计时的应用。
5. 部署BizTalk 应用程序之后,我们就可以开始测试我们的程序。首先们还是一样使用发送和接收文档适配器。来简单的实现将Excel处理成XML的过程。当我们把Excel文档拷贝到接收目录之后我们可以在发送目录看到如下内容的XML文档。
生成之后的XML Document
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:EmployeeResume xmlns:ns1="http://www.cbcye.com/BizTalk/Excel">
<BasicInformation>
<Name>张城斌(Gary Zhang)</Name>
<CellPhoneNumber>xxxxxxxxxxx</CellPhoneNumber>
<E-mail>cbcye@live.com</E-mail>
</BasicInformation>
<WorkingExperience>
<Work>
<Company>CBCYE.COM</Company>
<Position>CEO</Position>
<Period>04-08</Period>
</Work>
</WorkingExperience>
<ProjectExperience>
<Project>
<ProjectName>CBCYE.COM</ProjectName>
<Technology>BizTalk</Technology>
<Position>CEO</Position>
<MajorResponsibilities>Management</MajorResponsibilities>
<Period>04~05</Period>
</Project>
<Project>
<ProjectName>Quicklearn.cn</ProjectName>
<Technology>Asp.NET</Technology>
<Position>CEO</Position>
<MajorResponsibilities>Management</MajorResponsibilities>
<Period>05~06</Period>
</Project>
</ProjectExperience>
<Educations>
<Education>
<School>CBCYE.COM</School>
<Period>03-07</Period>
</Education>
</Educations>
<Languages>
<Language>
<Language>闽南语</Language>
<Level>母语</Level>
</Language>
</Languages>
<TechnicalSkills>
<TechnicalSkill>
<Technical>BizTalk</Technical>
<Level>了解</Level>
<Experience/>
</TechnicalSkill>
</TechnicalSkills>
<Comments>
<Comment/>
</Comments>
</ns1:EmployeeResume>
作者: ttggl 时间: 2009-5-26 11:40
6. OK,我们的最小原型实现了。其他的业务流程和发送目标可以按照实际需要实现。
7. 关于文档内容的校验,我们可以结合Schema的验证功能XML进行校验。这一部分的内容可以参考:BizTalk开发系列(十三) Schema设计之值约束
总结
虽然今天只介绍了XML映射在BizTalk对于Excel文档解析方面的应用,但XML映射不仅可以应用到BizTalk应用程序,也不仅在 BizTalk对于Excel的接收和解析方面。还可以在Asp.NET等其他应用程序和将XML文档输出到Excel等情况。总之在Excel与XML 相关的解决方案中XML映射给我们带来了非常灵活和良好的体验。
作者: ttggl 时间: 2009-5-26 11:41
BizTalk开发系列(三十四) Xpath。
XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk。但是如果对Xpath有一定了解的话,在很多应用下会使你的开发更加快捷。为了方便查阅整理了一些Xpath常识和实际实例给开发过程提供个参考。由于BizTalk还未支持Xpath2.0,所以以下的例子都是基于W3C 1.0规范。
Xpath的重要性 [实际的场景] 之前做一个升级的项目,在项目中需要对XML进行节点查找并比较里面相应的值,通过比较结果再选取它的父节点。由于接收到的XML文件节点值经常会多带一些空格。所以原有的系统是在自定义类库中循环选择节点值,删除左右空格然后再比较,取值。当然在还没有了解Xpath之前这么做可以。但了解了之后可以使用更简单的方法就可以解决了。接下来我会在下面提到解决办法。
基础及概念 XPath 使用路径表达式在 XML文档中选取节点。Xpath的路径包括绝对路径(以斜杠开头)和相对路径(不以斜杠开头)。节点是通过沿着步(step)来选取的,步与步之间使用斜杠("/") 分割。通常我们使用的Xpath表达式例如:/Root/Person其实是步的一种简写方式,如果使用步的语法来写的话应该是:/child::Root/child:
erson
步包括:
轴(axis) 定义所选节点与当前节点之间的树关系
节点测试(node-test) 识别某个轴内部的节点
零个或者更多谓语(predicate) 更深入地提炼所选的节点集
语法:
轴名称::节点测试[谓语]
下面列出了最常用的路径表达式:
| 表达式 | 描述 |
| nodename | 选取此节点的所有子节点 |
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |
另外由于XML是一个树型结构因此节点与节点之间有相应的关系,以下为节点之间的关系:
父(Parent)每个元素以及属性都有一个父。
子(Children)元素节点可有零个、一个或多个子。
同胞(Sibling)拥有相同的父的节点。
先辈(Ancestor)某节点的父、父的父,等等。
后代(Descendant)某个节点的子,子的子,等等。
作者: ttggl 时间: 2009-5-26 11:42
以上都是一些概念上的东西,不太理解也没有关系,只是为了统一一下概念而以。下面结合实例来和大家一起讲探讨一下Xpath在实际开发过程中的应用。可能有一些是比较基础的,就纯粹当个参考。 Xpath实践
在做实例前先准备一下执行Xpath的环境,XML Spy是一款比较好的XML相关的开发测试工具,只可惜是收费的。如果有条件的话建议还是使用XMLSpy。另外免费的工具里也有不错的选择,SketchPath就是其中的一款,下图为SketchPath的使用过程截图,该工具可以自动高亮显示Xpath查询的区域,底部还带有函数提醒功能等,比较适合在学习中使用。 
测试使用的XML源
选择节点
| 表达式 | 描述 |
| Root | 选取此节点的所有子节点 |
| /Root | 选取根元素 Root 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
| Root/Person | 选取所有属于 Root 的子元素的 Person 元素。 |
| //Name | 选取所有 Name 子元素,而不管它们在文档中的位置。 |
| Root//Name | 选择所有属于 Root 元素的后代的 Name 元素,而不管它们位于 Root 之下的什么位置 |
| //@lang | 选取所有名为 lang 的属性 |
| /Root/Person/* | 选取 Person 元素的所有子节点 |
| //* | 选取所有的元素 |
| //Person[@*] | 选取所有带属性的Person元素 |
| /Root/Person[1]/Name | /Root/Person[1]/Blog | 选取第一个Person节点下的Name和Blog节点 |
使用谓语(Predicates)
作者: ttggl 时间: 2009-5-26 11:42
谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。
| 表达式 | 描述 |
| /Root/Person[1] | 选取属于 Root 子元素的第一个 Person 元素。 |
| /Root/Person[last()] | 选取属于 Root 子元素的最后一个 Person 元素。 |
| /Root/Person[last()-1] | 选取属于 Root 子元素的倒数第二个 Person 元素。 |
| /Root/Person[position()<3] | 选取属于 Root 子元素的前两个 Person 元素。 |
| //Person[@ID] | 选取所有拥有名为 ID 的属性的 Person 元素。 |
| //Person[@ID="1001"] | 选取所有 Person 元素,且这些元素拥有值为 1001 的 ID 属性。 |
| /Root/Person[@ID>1001]/Blog | 选取所有 Root 元素的 Person 元素的Blog元素,且其中的 Person元素的ID 属性的值须大于 1001。 |
经常使用到的函数
函数:fn:local-name()
说明:返回当前节点的名称或指定节点集中的第一个节点 - 不带有命名空间前缀,由于在BizTalk中使用的XML一般是含有命名空间约束的,因此使用这个函数可以根据节点的名称来查找而不用管命名空间是否匹配。
例子:/Root/Person[1]/*[local-name()="Email"] 结果:返回所有节点名称为Email的节点。注意:由于示例的XML文档的Email节点受命名空间约束,所以使用/Root/Person[1]/Email的方式是取不到值的。
函数:fn:namespace-uri()
说明:返回当前节点或指定节点集中第一个节点的命名空间 URI
例子:/Root/Person[1]/*[local-name()="Email"]/namespace-uri() 结果:www.quicklearn.cn
函数:fn:count((item,item,...))
说明:返回节点的数量
例子:count(/Root/Person) 结果:2
函数:fn:normalize-space(string)
fn:normalize-space()
删除指定字符串的开头和结尾的空白,并把内部的所有空白序列替换为一个,然后返回结果。如果没有 string 参数,则处理当前节点。
例子:normalize-space(" The Space ") 结果: The Space
这个函数也是前文中提到的解决办法,具体使用大家自己试一下吧。
作者: ttggl 时间: 2009-5-26 11:43
其他例子
| 表达式 | 描述 |
| /Root/Person/Name[@lang="en"]/preceding::Blog | 选取Name节点中lang属性值为en的同级Blog节点 |
| string(/Root/Person[1]/Name/text()) | 选取第一个Person节点下的Name节点值,并以string类型输出 |
| number(/Root/Person[1]/@ID) | 选取第一个Person节点下的ID属性值,并以number类型输出 |
| /Root/Person/Name[@lang="en"]/../*[local-name()="Email"]/text() | 选取Name节点中lang属性值为en的节点的同级节点Email的值 |
参考资料
XML Path Language (XPath) Version 1.0
Xpath
函数列表
Xpath轴
作者: ttggl 时间: 2009-5-26 11:43
BizTalk开发系列(三十五) TCP/IP 适配器。
BizTalk 的TCP/IP适配器最初是为英国的保健行业开发。该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯。
TCP/IP适配器支持以下几种交互模式:
Request Only 消息被发送到BizTalk并路由到任何流程(Orchestration)或发送端口。
Request-Response 消息被发送到BizTalk并接收从BizTalk返回的远端服务器的返回信息。
Solicit Only 消息从BizTalk发送到远端服务器。
Solicit-Response 消息从BizTalk发送到远端服务器,并接收远端服务器的返回信息。
Dynamic Solicit 动态发送。
Duplex Request 客户端的全双工请求。
Duplex Solicit BizTalk的全双工请求。
使用前的准备与安装
由于BizTalk不自带TCP/IP适配器,因此在使用之前需要先到CodePlex的BTSTCPIP站点上去下载安装文件,安装过程比较简单,但是需要注意的是在安装之后或者在安装过程中需要对文件对话框里的配置文件内容手动添加到BizTalk的运行时配置文件(BTSNTSvc.exe.config)。
否则在运行时会出现 “The type initializer for 'Microsoft.Samples.BizTalk.Adapter.Tcp.Receive.ReceiveAdapter' threw an exception.”的异常。
添加适配器
安装完毕之后需要在BizTalk管理控制台添加该适配器,以过程是为了给TCP/IP适配器创建相应的接收和发送主机。
作者: ttggl 时间: 2009-5-26 11:44
在适配器的属性配置窗口,输入相应的适器名称,在适配器选项列表中选择适配器,应用之后就会在右侧的窗口看到该适配器的接收和发送主机。
演示
该适配器具体的说明可以参考安装目录下的《TCPIP Adapter UserGuide》,在以下的演示时我们同时将使用到安装目录下的:TcpClient.exe,TcpServer.exe工具。分别作为TCP请求客户端和TCP服务器。如果对TCP传输的内容感兴趣的话也可以使用tcpTrace(第三方工具)来监听传输过程中的数据包。
以下要演示的是比较好理解的两个场景,一个是单向请求和双向请求。演示的逻辑是在BizTalk先创建一个TCP/IP的接收端口,用来监听来自TCPClient.exe发送的请求。再创建一个发送端口订阅来自相应接收端口传过来的数据。并该消息发送到TCPServer.exe。具体的配置过程可以参考用户手册。
单向请求
1.接收端口配置
2.TCP接收适配器属性配置
作者: ttggl 时间: 2009-5-26 11:44
3.发送端口配置
4.TCP发送适配器属性配置
5.结果
双向请求
配置步骤与单向的基本一致,只是在创建端口时选择双向的端口类型即可。
1.TCPServer的配置
2.请求与结果
作者: ttggl 时间: 2009-5-26 11:45
在TCP适配器配置中所使用的[S],[E]是接收适配器识别的起止符,不能修改。而[start],[end]为返回数据的起止符可以修改。另外TCP/IP适配器还支持双工访问,等整明白了再跟大家分享。
作者: ttggl 时间: 2009-5-26 11:45
BizTalk开发系列(三十六) Orchestration单实例执行。
BizTalk 是高效的消息处理引擎,采用多线程并发的方式来处理消息。也就是说当有消息被接收的时候就会产生一个新的消息处理实例。但有时目标系统可能并没有并发处理的能力, 这时就需要在BizTalk中采用单实例的方式来处理消息。在BizTalk的管道中直接可以启用按序送达的方式来实现, 但是在Orchestration中并没有提供类似的选项.该如何做到呢?
其实在BizTalk中可以根据设置消息的CorrelationSet也就是相关属性来实现这样的效果。也就是第一条消息进来之后创建一个Orchestration实例,并且初始化相关集,接下来接收到的消息,如果有相同的相关集的话都会由相同的Orchestration实例来处理而不会创建新的Orchestration实例。
接下来就来实现这样的一个Demo
首先创建Schema,创建完之后新建Orchestration并创建相应的消息。接下来参照下图在Orchestration中画出相应的图形:
绑定相应的消息到Receive, Send形状中,并连接接收与发送形状及端口。本Demo中没有对消息进行转换。只是实现端到端的消息传递而已。
到目前为止整个流程已经基本建完了。不过现在还不能实现之前预想的功能。还需要做下面关键的一步: 创建和设置Correlation
1. 在 Orchestration View的Type类型的Correlation Types里创建CorrelationType.本Demo实现的是以某个Receive Port接收到的消息作标识.此选择CorrelationProperlity属性要选择BTS.ReceivePortName
作者: ttggl 时间: 2009-5-26 11:46 
2. 接着创建Correlation Set. 在Orchestration View的TransferOrch中创建.
3. Correlation Set创建好之后需要做两部分操作一个是初始化.注意在一个Orchestration里面CorrelationSet只能被初始化一次。因此。在本流程中。将Receive_1的Initializing CorrelationSets设置为刚才设置的Correlation Set。
4. 在Receive_2的Following Correlation Sets设置为刚才设置的Correlation Set
至此Singleton Orchestration已经设计好了。给程序集完成程序签名、部署和设置之后来看看实际运行的效果。
接收端口会批量接收消息(当然这里你可以选择按序接收)。第一个消息进行Orchestration之后会先创建Orchestration实例。接下来的消息会使用原有的Orchestration 实例进行处理。当然消息必须是来自于同一个接收端口。这也是之前我们设定的Correlation。
4644

被折叠的 条评论
为什么被折叠?



