Biztalk 日期时间 Functoids





5.00/5 (2投票s)
Biztalk 日期时间 Functoids
Content
引言
本文档假定您对映射有一定的基本了解。此外,本文档对正在练习日期时间 Functoids 的人员来说尤其有用。我建议您在查看附件文件之前,先阅读整篇文章。
本文档将涵盖以下主题:
- 现有的日期时间/相关 Functoids。
- 使用 C# 脚本 Functoid 进行日期时间验证扩展
- 在脚本 Functoid/映射应用程序中消耗 C# 脚本 DLL。
我们还将涵盖以下通用场景:
- 检查指定的输入字符串值是否为有效的日期时间,并在其有效时将结果值传递/显示在输出文件中。
- 将本地日期时间转换为 UTC/GMT 日期时间。
例如:
输入值: 9/1/2008 1:00:00 AM
输出值: 8/31/2008 7:30:00 PM (转换为本地时间)
注意:此处本地时间(输入值)为印度时区,即 (GMT+5:30) - 传递 UTC 日期时间/任何时区的日期时间并仅提取时间。
例如:
输入值: 2012-07-23T23:10:00Z
输出值: 04:40 // 这是根据用户本地时区计算的 - 传递 UTC 日期时间/任何时区的日期时间并仅提取其中的月份(本地时区格式)
例如:
输入值: 2012-07-23T23:10:00Z
输出值 : 7 - 传递 UTC 日期时间/任何时区的日期时间并仅提取其中的年份(本地时区格式)
例如:
输入值: 2012-07-23T23:10:00Z
输出值 : 2012 - 传递 UTC 日期时间/任何时区的日期时间并以特定格式提取月份和日期。
例如:
输入值: 2012-07-23T23:10:00Z
输出值: July 24 - 查找两个日期时间之间的差值。
例如:
输入值: 09/11/1982T12:00:00-05:30
输出值: 29 年,10 个月,3 周,5 天。
注意:内部比较的是今天的系统日期时间,即 07/26/2012T14:00:00Z - 比较两个日期时间。
例如:
输入值: 09/11/1982T12:00:00-05:30
结果值: 较小 - 传递 UTC 日期时间并将其转换为本地日期时间。
例如
输入值: 2012-07-23T23:10:00Z
结果值: 7/24/2012 10:10:00 AM
注意:结果以印度时区(GMT+5:30)显示。我没有特别关注日期格式,这在我们上面的示例(例如 VI)中已经看到。
应用程序开发与执行
现在,让我们开始开发。在开始之前,我假设您的机器上已安装了所需的设置。供您参考,我在开发附带的示例时使用了以下版本:
- Microsoft Visual Studio 2008
- Microsoft BizTalk Server 2009
您也可以迁移到更高版本。现在,让我们开始在 Biztalk 中进行架构设计,
输入架构
请注意,输入和输出文件的类型均为平面文件类型,每个字段的属性更改如下所示:
子字段元素 | 属性 | 值 |
日期时间 | 数据类型 | xs:string |
最大出现次数 | * | |
最小出现次数 | 0 | |
最小出现次数 | 0 | |
UTCDateTime | 数据类型 | xs:dateTime |
最大出现次数 | * | |
最小出现次数 | 0 | |
DateTimeOffSet | 数据类型 | xs:string |
最大出现次数 | * | |
最小出现次数 | 0 |
输出架构
在上面的架构中:
子字段元素 | 属性 | 值 |
所有字段 | 数据类型 | xs:string |
最大出现次数 | * | |
最小出现次数 | 0 |
现在,请下载包含用于映射测试的示例输入文件的文件夹。您也可以从源架构生成示例输入文件。在解决方案中,您会看到下面的映射文件,其中包含许多 Functoids。
我们将在以下主题中逐一介绍所有 Functoids。
I. 现有的日期时间/相关 Functoids
现在,为了实现附件文件中的所有场景,我们将从现有的 Functoids 开始。在“日期/时间 Functoids”部分中,我们有以下 Functoids。
图 1.1 日期/时间 Functoids
如果查看列表,我们会发现只有四个 Functoids,我们可以根据我们的需求和需要将它们与许多其他现有 Functoids 相关联。
- 日期和时间可获取当前的系统日期时间。
- 时间可返回当前的系统时间。
- 日期可仅返回系统日期,不包含时间。
- 添加天数,可以在现有日期上添加额外的天数。
我们还有一个 Functoid,它检查输入值是否为有效的日期时间值,这在图 1.2 中,是逻辑 Functoids 的一部分。
图 1.2 逻辑日期
现在,让我们来看下面的场景 (1):“检查指定的输入字符串值是否为有效的日期时间,并在其有效时将结果值传递/显示在输出文件中。”
为了实现这一点,首先我们将获取逻辑日期和值映射到页面上,并进行如下映射。如果值有效,则逻辑 Functoid 将将 True 作为输入值传递给值映射 Functoid,值映射 Functoid 将考虑将实际输入日期时间值传递给目标日期时间字段;如果收到 False 作为输入,则该字段不会显示在输出文件中。
图 1.3 场景 I
在映射文件 (.btm) 属性中,转到“测试映射输入实例”并在构建和测试它之前添加输入文件。由于我们在附件解决方案中传递了有效输入值,输出文件将包含日期时间值。
II. 使用 C# 脚本 Functoid 进行日期时间验证扩展
现在,让我们来看场景 (II),其中我们将输入值转换为 UTC/GMT 日期时间值。请按如下方式进行映射:
在这里,我们将使用脚本 Functoid 来扩展验证。现在,如果日期时间有效,我们将把日期时间转换为 UTC/GMT 日期时间,或者不显示任何值在目标文件中。在脚本 Functoid 中,我们将编写用于 UTC 转换的脚本。为此,请右键单击脚本 Functoid 并选择“配置脚本 Functoid”,然后首先选择脚本类型。此处我们使用 C#,因此请选择 C#,然后编写以下 C# 代码。
public string GetUTCDateTime(string param1)
{
return Convert.ToDateTime(param1).ToUniversalTime().ToString();
}
注意:我没有遵循任何编码标准,但可以根据所需的标准/要求进行改进。
III. 在脚本 Functoid/映射应用程序中消耗 C# 脚本 DLL
现在,如果我们查看从 (3 到 9) 的场景,每个场景都需要逻辑扩展,并且我们必须在每个脚本 Functoid 中编写脚本。而且,我们必须每次都要修改映射应用程序。更好的方法是使用一个外部 DLL,其中包含所有脚本。如果需要进行任何逻辑级别的修改(数据/服务契约级别以外),我们只需要更新逻辑并部署 DLL,然后在映射应用程序中升级,而无需修改脚本 Functoid。另一部分是,使用 VS(因为它有一个编译器)很容易找到错误,但在 Biztalk 中,我们没有在脚本 Functoid 中编译脚本的选项。
现在,让我们打开 Visual Studio。
转到文件 -->
新建项目 -->
Visual C# -->
选择类库,
指定应用程序名称(例如 BiztalkDateTimeScript)、位置(例如 D:\Biztalk\Samples)并单击“确定”,现在您将看到一个包含一个默认类文件(名为 class1
)的解决方案。
您可以重命名现有的文件或添加一个名为 BiztalkDateTimeScript.cs 的新类文件。如果您计划重命名,请打开该文件并更改 cs 文件内的类名。现在,添加以下方法以从输入的 dateTime 中提取时间。
public string getTime(string _inputDateTimeValue)
{
try
{
_inputDateTimeValue = validatedatetimeValue(_inputDateTimeValue);
return Convert.ToDateTime(_inputDateTimeValue).ToString("HH:mm");
}
catch (Exception)
{
throw;
}
}
现在,构建解决方案并查看它是否成功构建。完成后,请为解决方案添加强名称并将程序集部署到 GAC。为此,请遵循以下链接。
创建强名称:http://msdn.microsoft.com/en-us/library/xwb8f617(v=vs.71).aspx
或者,您可以按照以下步骤操作:转到 VS Studio 命令提示符 -> 输入 CD\ -> 输入 sn –k “指定创建强名称的名称和位置”
将程序集部署到 GAC:http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx
在应用程序/解决方案属性 -> 转到签名(这是 VS 2008 中的最后一个属性),在那里选择程序集并构建它。完成后,请再次返回 VS 命令提示符并键入以下命令。
Gacutil /I <give the dll with full and correct path>, it will prompt the message "assembly successfully added to the globle catch."
现在,您已准备好在映射应用程序中使用脚本 DLL。现在,按照如下方式设计您的映射应用程序。
现在,右键单击第二个脚本 Functoid 并选择“配置 Functoid”,您将看到如下屏幕。请注意,映射器中的前三个 Functoid 是您在之前的主题中已经处理过的。
这次请选择“外部库”,因为您将使用已消耗的 DLL 脚本。
现在,选择脚本程序集,您将注意到脚本 DLL 已包含在其中,这是您在应用程序(通常在第一个位置)中包含的。然后选择“脚本类”中的类。因为我们在脚本类中有一个类,所以我们只会找到一个;否则,请选择所需的。现在,在“方法”下拉列表中选择所需的方法。这里我涵盖了场景 III 的示例代码,但所有其他场景的代码都包含在附件文件夹中。要查看和执行,请下载、构建并测试映射。
另外,对于场景 (6),以下链接可能对您有所帮助:http://www.csharp-examples.net/string-format-datetime/
预期的错误,捕获到异常:映射具有空的源和目标架构。
- 如果您遗漏了类库的 DLL。
输出验证错误:根元素缺失。/ 输出验证错误:“任何子字段”元素无效
- 如果您遗漏了映射的输入文件/路径无效。
好了,我几乎完成了,现在轮到您了,如果在构建过程中遇到任何问题或需要进一步的改进,请随时反馈。我将非常乐意处理您正在寻找的场景,并更新本文档供他人使用。
历史
Biztalk 日期时间 Functoids 第一版