一直都是用BizTalk与FlatFile打交道,最近在使用WebMethod时,也碰到一些棘手的FlatFile,写出来和大伙分享下。
使用BizTalk处理FlatFile时,首先可以使用FlatFile wizard对已有的FlatFile Sample文件进行解析,典型的所见即所得的形式,很容易的就可以做出那样的Schema。即使没有现成的Sample文件,也可以通过添加Record、Filed,设定Record和Filed之间的Delimiter或者Postion,最后在自定义一个Receive 或者 Send 的PipeLine就可以实现对FlatFile的处理了。
使用WebMethod处理FlatFile时,就有很多注意的问题了。
WebMethod处理的FlatFile包括两种方式,一种是带tag的,另一种是不带tag的。
1)带tag的FlatFile:对于FlatFlie Schema的每一个Record,都要在FlatFile中存在一个RecordName和Schema中的RecordName匹配。
例如在WebMethod中我们定义了如下的FlatFile Schema:
Figure 1:FF Schema with tagID
这个Schema引用了两个在FlatFile dictionary的Record,构成了我们的Order。他的Defination如下:
Figure 2:FF Defination with tagID
对这样的一个Schema,我们需要什么样的Sample 才能与之匹配呢?
请注意下面的Sample的内容:
----------------------------------------
Header*Jason*ShangHai*13098765432
Detail*123*234*12340878 2344
----------------------------------------
在每一行的最前面都有一个标志,这个标志和我们定义的Schema里面的Record的名字是一样的。比如Header和Header的Filed之间也使用*分隔(注意在我的dictionary中CustName和POQty的NTH的标志是从1开始的,这样他才能忽略我的每个Record起始位置的tag)。一直不明白为什么WebMethod要这样做,按照在BizTalk的做法,这个tag是可有可无的,只要我的Header和Detail都是Mandatory的,那么根本不需要在前面加tag。
按照WebMethod的官方文档,在FlatFile中,必须有这么个标志位去match他的Schema中的Record。也是这只是WM的一种作为分辨的标识,但是它有提供了另外一种方式,可以需要使用那个tag。
看下面的图:
Figure 3:FF Schema without tagID
这个FlatFile的Schema就是直接设置成了dictionary中的Header,和上面的Figure 1不一样的是,他只有一个节点,就像在BizTalk中的最上层的Schema那个节点一样。但是他的类型是Header的。
这个Schema的Sample 如下:
----------------------------------------
Jason*ShangHai*13098765432
Jason1*ShenZhen*13098765432
Jason2*BeiJing*13098765432
----------------------------------------
很明显,这个Schema只能识别简单结构的FlatFile了。这对我们来说可不是好事,虽然不需要tag了,但是不能构造我们需要的内容了。
那么,对于我们的如下的Sample,WebMethod该如何处理呢?
----------------------------------------
Jason*ShangHai*13098765432
123*234*12340878 2344
----------------------------------------
答案在我知道后揭晓。:)