BizTalk开发系列(二十七) 异常管理中的数据编码
在BizTalk的异常管理解决方案中。大部分是通过订阅相关的升级属性来接收消息,并在自定义的流程或发送端口进行处理。但不管怎样,一般会定义统一的 错误消息Schema,这样不仅可以让我们通过异常信息快速的查找错误。还可以方便的跟不同的系统或存储方式做映射。
虽然在BizTalk内部唯一使用Xml文档,但BizTalk所能接受的消息不单单只有XML文档。RAR,ZIP,WMA,WMV等等都是 BizTalk可以接收的消息。这就给BizTalk的异常管理造成了一定的麻烦,因为原消息一般会包含到统一的异常消息里。如果消息在产生异常之前就已 经被拆装为相应的XML文档的话则可以很方便的借用XMLDocument对像的OuterXML属性获得原消息的消息体。但是如果消息是在 Adapter或pipeline出错的话则可能消息往往还没有被处理成XML。
在捕获异常消息的时候通常将使用XMLDocument对像进行捕获,但如果直接使用XMLDocumentObject.OuterXML属性获取消息的话则会产生类似如下的错误:
Data at the root level is invalid. Line 1, position 1 Excepion
因些需要对异常消息进行重新编码。在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; } } }
但如果原消息是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接收和发送的的就都是Formatted
XML的话就不需要编码了,如果还有Txt,CSV之类的平面的文件的话可以直接返回String,方便查看。
最后如果是比较复杂的集成环境就需要使用Base64对数据进行统一编码。还可以使用InfoPath等客户端软件来实现异常管理平台。
[1] Base64是一种使用64基的位置计数法。它使用2的最大次方来代表仅可打印的ASCII
字符。这使它可用来作为电子邮件的传输编码。在Base64中的变量使用字符A-Z、a-z和0-9
,这样共有62个字符,用来作为开始的64个数字,最后两个用来作为数字的符号在不同的系统中而不同。
BizTalk开发系列(二十七) 异常管理中的数据编码的更多相关文章
- BizTalk开发系列(二十八) MSMQ 适配器
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...
- BizTalk开发系列(二十二) 开发自定义Map Functoid
尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...
- Windows下USB磁盘开发系列二:枚举系统中所有USB设备
上篇 <Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘). 主要调用的API如下: 1 ...
- BizTalk开发系列(二十五) SQL Adapter
SQL Server 是.NET开发的首选数据库.当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数 ...
- BizTalk开发系列(二十三) BizTalk性能指标参考
BizTalk项目目前比较少,使用的客户也不多.大多只知道BizTalk是一个不错的产品,是Microsoft SOA平台的核心产品,不过还没有将其应用到生产环境.还有一些客户对BizTalk的性能不 ...
- BizTalk开发系列(三十七) 性能监视器在BizTalk性能测试中的使用
BizTalk应用程序的性能测试和分析是一个非常重要的过程,因为BizTalk的应用程序在Run-time时受部署结构.消息请求数量和消息大小等 的影响很大,因此无论是简单还是复杂的的应用都需要在部署 ...
- BizTalk开发系列(二十四) BizTalk项目框架建议
Asp.NET有MVC框架,大部份的开发都是按照MVC进行的.BizTalk是面向消息的开发,不能完全采用分层的开发模式.而微软只提供了 BizTalk项目开发的基本策略,通过分析相关的Complex ...
- BizTalk开发系列(二) "Hello World" 程序搬运文件
我们在<QuickLearn BizTalk系列之"Hello World">里讲到了如何快速的开发第一个BizTalk 应用程序.现在我们来讲一下如何把这个程序改成用 ...
- BizTalk开发系列(二十六) 使用Web Service
Web Service是在构建SOA平台中广泛使用的技术.在BizTalk开发过程中使用SOAP适配器接收和发送 Web Services 请求.业务流程可以发布为 Web Services 并使用外 ...
随机推荐
- HTTP协议开发应用-文件服务器
HTTP(超文本传输协议)协议是建立在TCP传输协议之上的应用层协议.HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 本文将重点介绍如何基于Netty的 ...
- SU suxcontour命令学习
- 20145223《Java程序程序设计》课程总结
20145223<Java程序程序设计>课程总结 每周读书笔记链接汇总 第一周学习总结 第二周学习总结 第三周学习总结 第四周学习总结 第五周学习总结 第六周学习总结 第七周学习总结 第八 ...
- 记一次Runtime的巧用
背景 我们的视频直播是用的大华乐橙的解决方案,而他们近期出来个新的SDK,并且对老版SDK不兼容,而这周,终于把大华乐橙的新版SDK切换了,和这一周做的新的东西,一起提交审核了,并且今天也通过审核了. ...
- 如何处理js的跨域问题
在bill.mail.10086.cn域内访问smsrebuild1.mail.10086.cn下的接口出现“阻止跨域源请求” 例如: URL 说明 是否允许通信 http://www.a.com/a ...
- 用R进行市场调查和消费者感知分析
// // 问题到数据 理解问题 理解客户的问题:谁是客户(某航空公司)?交流,交流,交流! 问题要具体 某航空公司: 乘客体验如何?哪方面需要提高? 类别:比较.描述.聚类,判别还是回归 需要什么样 ...
- iOS学习35数据处理之文件读写
1. 沙盒机制 1> 沙盒概述 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹), 这个独立.封闭.安全的空间,叫做沙盒 注:① 每一个应用程序都会拥有一个应用程序沙盒 ② 应用程序 ...
- 【BZOJ1984】月下“毛景树” 树链剖分+线段树
[BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...
- [知识点]A*搜索(启发式搜索)
// 此博文为迁移而来,写于2015年4月4日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vwud.html 1.前言 ...
- BZOJ 1012 题解
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8468 Solved: 3702[Submi ...