﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-montaque</title><link>http://www.cnblogs.com/montaque/</link><description>小碗喝酒,小口吃肉</description><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 19:48:47 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 19:48:47 GMT</pubDate><ttl>60</ttl><item><title>WPF/Silverlight 中利用XamlReader /Writer 来处理对象的序列化反序列化</title><link>http://www.cnblogs.com/montaque/archive/2008/08/12/1265617.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Tue, 12 Aug 2008 00:59:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/08/12/1265617.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1265617.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/08/12/1265617.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1265617.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1265617.html</trackback:ping><description><![CDATA[<p>在 Silverlight 中，有几种获取后台数据的方式。 通过会有一个Service来暴露这些数据，对于sl2 这个service可以是最简单的ASMX或者用WCF的basichttpbinding， 您可以通过添加引用来生成代理，来适用这个service。</p>
<p>&nbsp;</p>
<p>如果只是简单的数据的话，你也可以通过访问一个远程的XML文件来获取这些数据，拿到XML之后，需要把他转换成对象。也有几种方式</p>
<ul>
    <li>用xmlReader</li>
    <li>用LinqForXml</li>
    <li>用系统解析XAML的方式，也就是本文中提到的方式。其实是最简单的一种方式。</li>
</ul>
<p>思路：</p>
<p>首先定义个对像，我们知道在WPF/Silverlight 的class Resource中可以加入资源，资源可以是任意的对象。</p>
<p>而在程序中，可以通过访问资源Key的方式拿到这些对象。事实上，他拿这些对象的时候，就是适用一个简单的XamlReader来反序列化之。</p>
<p>&nbsp;</p>
<p>一下是一个简单的Demo</p>
<p>&nbsp;</p>
<p>假定有一下Class</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_085134" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_085134').style.display='none'; document.getElementById('Code_Open_Image_085134').style.display='inline'; document.getElementById('Code_Open_Text_085134').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_085134" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_085134').style.display='none'; getElementById('Code_Closed_Image_085134').style.display='inline'; getElementById('Code_Closed_Text_085134').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_085134">Code</span><span id="Code_Open_Text_085134" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;WpfApplication1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Age&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Name&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;ShippingAddress&nbsp;{</span><span style="color: #0000ff">get</span><span style="color: #000000">;</span><span style="color: #0000ff">set</span><span style="color: #000000">;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Address<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;FirstLine&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Zipcode&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>这时候你可以在resource中，加上一个自己的xmlns前缀，指向这个class所有的namespace和assembly</p>
<p>比如在Xaml中你可以这样些，这时候有很好的智能提示。</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_085315" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_085315').style.display='none'; document.getElementById('Code_Open_Image_085315').style.display='inline'; document.getElementById('Code_Open_Text_085315').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_085315" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_085315').style.display='none'; getElementById('Code_Closed_Image_085315').style.display='inline'; getElementById('Code_Closed_Text_085315').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_085315">Code</span><span id="Code_Open_Text_085315" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">Application&nbsp;</span><span style="color: #ff0000">x:Class</span><span style="color: #0000ff">="WpfApplication1.App"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;StartupUri</span><span style="color: #0000ff">="Window1.xaml"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:Obj</span><span style="color: #0000ff">="clr-namespace:WpfApplication1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Application.Resources</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person&nbsp;</span><span style="color: #ff0000">x:Key</span><span style="color: #0000ff">="hello"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.Name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hello</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.Name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.Age</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">30</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.Age</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.ShippingAddress</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address.FirstLine</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">FirstLine</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address.FirstLine</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address.Zipcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">91792</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address.Zipcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.ShippingAddress</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Application.Resources</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Application</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></span></div>
<p>&nbsp;</p>
<p>然后我们新建一个xml文件，把我们写好的xaml copy进去。删掉一些不必要的属性，不如Key。 和 class</p>
<p>变成一下xml</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_085424" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_085424').style.display='none'; document.getElementById('Code_Open_Image_085424').style.display='inline'; document.getElementById('Code_Open_Text_085424').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_085424" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_085424').style.display='none'; getElementById('Code_Closed_Image_085424').style.display='inline'; getElementById('Code_Closed_Text_085424').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_085424">Code</span><span id="Code_Open_Text_085424" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person&nbsp;</span><span style="color: #ff0000">xmlns:Obj</span><span style="color: #0000ff">="clr-namespace:WpfApplication1;assembly=WpfApplication1"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.Name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hello</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.Name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.Age</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">30</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.Age</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Person.ShippingAddress</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address.FirstLine</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">FirstLine</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address.FirstLine</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Obj:Address.Zipcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">91792</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address.Zipcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person.ShippingAddress</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Obj:Person</span><span style="color: #0000ff">&gt;</span></span></div>
<p>&nbsp;</p>
<p>然后用一下简单的代码就可以反序列化得到对象的访问。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_085529" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_085529').style.display='none'; document.getElementById('Code_Open_Image_085529').style.display='inline'; document.getElementById('Code_Open_Text_085529').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_085529" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_085529').style.display='none'; getElementById('Code_Closed_Image_085529').style.display='inline'; getElementById('Code_Closed_Text_085529').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_085529">Code</span><span id="Code_Open_Text_085529" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;XamlReader&nbsp;readr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XamlReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;o</span><span style="color: #000000">=</span><span style="color: #000000">readr.LoadAsync(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.IO.FileStream(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">r:\WpfApplication1\WpfApplication1\XMLFile1.xml</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMode.Open&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;Person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span></span></div>
<p>&nbsp;</p>
<p>如果是Sl， 把LoadAsyc改为Load就可以了。 </p>
<p>如果正式应用的话，可以把Xml放在服务端，然后通过webclient download，然后调用以上代码做反序列化。</p>
<p>&nbsp;</p>
<p>然后你就可以做正常的binding，Animation了，当然要正常工作的话，属性要改为DependencyProperty</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/montaque/aggbug/1265617.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41943/" target="_blank">[新闻]轮回－新浪推出Facebook模式的SNS</a>]]></description></item><item><title>让你的Expression XAML 编辑器支持智能提示</title><link>http://www.cnblogs.com/montaque/archive/2008/08/06/1261601.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Tue, 05 Aug 2008 23:50:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/08/06/1261601.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1261601.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/08/06/1261601.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1261601.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1261601.html</trackback:ping><description><![CDATA[<p>Expression blend 2.5 是目前的最新版本用来支持WPF和Silverlight Beta2 的开发。一般我们可视化的拖放和设计界面和效果。有时候如果你要人为的编辑一下Xaml的话发现没有智能提示非常不方便。有些属性很长的话，很难记住。</p> <p>由于Expression本省是个WPF程序， 当然也是标准的.net程序。所以扩展其实很容易，Expressoin提供了一个IAddIn接口，你只要实现该接口就可以了。  <p>我上次提到的Kaxaml，免费的xaml编辑器有这个智能提示的功能，能否切换到Expression中呢 <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/ExpressionXAML_ECA8/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/ExpressionXAML_ECA8/image_thumb.png" width="644" height="465"></a>  <p>&nbsp; <p>telerick的<a href="http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/IntelliSense_for_Expression_Blend.aspx">Stefan</a>就是简单的提出Kaxaml的代码，然后实现接口. Expression的启动的时候加上这个DLL，就有智能提示的功能了。 <p>&nbsp; <p>插件下载地址：<a title="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;ReleaseId=1358" href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;ReleaseId=1358">http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;ReleaseId=1358</a> <p>&nbsp; <p>下载好解压到expression目录，注意只支持2.5 June版本。然后启动的时候加上个开关加载该DLL就好了。 <p>Blend.exe -addin:Addins\Expression.Blend.IntelliSense.dll <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/ExpressionXAML_ECA8/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/ExpressionXAML_ECA8/image_thumb_2.png" width="644" height="465"></a>  <img src ="http://www.cnblogs.com/montaque/aggbug/1261601.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41940/" target="_blank">[新闻]惠普139亿美元完成对EDS的收购</a>]]></description></item><item><title>silverlight 测试</title><link>http://www.cnblogs.com/montaque/archive/2008/08/02/1258553.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Fri, 01 Aug 2008 19:26:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/08/02/1258553.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1258553.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/08/02/1258553.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1258553.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1258553.html</trackback:ping><description><![CDATA[<p>最近几天参加了IdentityMine 的一个Silverlight培训。 identityMine跟微软的公司很好，他做的很多Case都是Microsoft的。可以从www.identityMine.com 看到他们在WPF和Silverlight方面的一些case。</p>
<p>他们公司的人大概有三种，一种是Designer一种是开发人员。另外一个很重要的就是Integrator。做两者的沟通，培训的一个将是 Robby 就是一个integrator。很有designer的sense，技术有不错。</p>
<p>推荐他的blog， www.nerdplusart.com 他的blog还被列在sliverlight的showcase上面。</p>
<p>他还做了一个xaml 编辑工具&#160;http://kaxaml.com/。&#160;</p>
<p>对于开发人员，我们更多的考虑数据的集成，业务的设计。而很多界面和动画上的东西都会觉得很复杂，以前我觉得做一个小球在箱子理撞来撞去的应用觉得很复杂，要计算运动轨迹。。。</p>
<p>后来看了一个他们做的demo，超简单。代码如下，呵呵。就是xy按照不同的速度然后原路运动而已。一下是一个demo，呵呵</p>
<script type="text/xaml" id="xaml">        <?xml version="1.0"?>       <Canvas x:Name="LayoutRoot" Background="LightBlue" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >        <Canvas.Resources>            <EventTrigger x:Name="et" RoutedEvent="Canvas.Loaded">            <BeginStoryboard >                                <Storyboard>                    <DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="red"
Storyboard.TargetProperty="(Canvas.Left)" From="0" To="350" AutoReverse="True" RepeatBehavior="Forever" ></DoubleAnimation>                    <DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="red"
Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" AutoReverse="True" RepeatBehavior="Forever"></DoubleAnimation>                    <DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="green"
Storyboard.TargetProperty="(Canvas.Left)" From="50" To="350" AutoReverse="True" RepeatBehavior="Forever" ></DoubleAnimation>                    <DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="green"
Storyboard.TargetProperty="(Canvas.Top)" From="50" To="350" AutoReverse="True" RepeatBehavior="Forever"></DoubleAnimation>                    <DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="blue"
Storyboard.TargetProperty="(Canvas.Left)" From="100" To="350" AutoReverse="True" RepeatBehavior="Forever" ></DoubleAnimation>                    <DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="blue"
Storyboard.TargetProperty="(Canvas.Top)" From="100" To="350" AutoReverse="True" RepeatBehavior="Forever"></DoubleAnimation>
</Storyboard>            </BeginStoryboard>            </EventTrigger>
</Canvas.Resources>		<Ellipse Height="50" Width="50" Fill="#FFEE6C13"   StrokeThickness="0" x:Name="red"
HorizontalAlignment="Left" VerticalAlignment="Top"/>		<Ellipse Width="50" Fill="#FFB3E80C"   StrokeThickness="0" Height="50" x:Name="green"
HorizontalAlignment="Left" VerticalAlignment="Top"/>		<Ellipse Width="50" Fill="#FF09D1F0"   StrokeThickness="0" Height="50" x:Name="blue"
HorizontalAlignment="Left" VerticalAlignment="Top"/>	</Canvas>    </script>
<object type="application/x-silverlight" width="400" height="400">
<param name="background" value="LightGreen" />
<param name="source" value="#xaml" /> <!-- [2] -->    </object>
<p><br />
</p>
<p>
<p>&lt;Canvas.Resources></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160;&lt;EventTrigger x:Name="et" RoutedEvent="Canvas.Loaded"></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160;&lt;BeginStoryboard > &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;Storyboard></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="red"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Left)" From="0" To="350" AutoReverse="True" RepeatBehavior="Forever" >&lt;/DoubleAnimation></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="red"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" AutoReverse="True" RepeatBehavior="Forever">&lt;/DoubleAnimation></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="green"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Left)" From="50" To="350" AutoReverse="True" RepeatBehavior="Forever" >&lt;/DoubleAnimation></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="green"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Top)" From="50" To="350" AutoReverse="True" RepeatBehavior="Forever">&lt;/DoubleAnimation></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:3" Storyboard.TargetName="blue"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Left)" From="100" To="350" AutoReverse="True" RepeatBehavior="Forever" >&lt;/DoubleAnimation></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;DoubleAnimation BeginTime="0" Duration="0:0:2" Storyboard.TargetName="blue"&#160;</p>
<p><br />
</p>
<p>Storyboard.TargetProperty="(Canvas.Top)" From="100" To="350" AutoReverse="True" RepeatBehavior="Forever">&lt;/DoubleAnimation> &#160;&#160;</p>
<p><br />
</p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#160;</p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;/Storyboard></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160;&lt;/BeginStoryboard></p>
<p>&#160;&#160; &#160; &#160; &#160; &#160; &#160;&lt;/EventTrigger></p>
<p><br />
</p>
<p>&#160;&#160; &#160; &#160; &#160;&lt;/Canvas.Resources></p>
<p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;Ellipse Height="50" Width="50" Fill="#FFEE6C13" &#160; StrokeThickness="0" x:Name="red"&#160;</p>
<p><br />
</p>
<p>HorizontalAlignment="Left" VerticalAlignment="Top"/></p>
<p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;Ellipse Width="50" Fill="#FFB3E80C" &#160; StrokeThickness="0" Height="50" x:Name="green"&#160;</p>
<p><br />
</p>
<p>HorizontalAlignment="Left" VerticalAlignment="Top"/></p>
<p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;Ellipse Width="50" Fill="#FF09D1F0" &#160; StrokeThickness="0" Height="50" x:Name="blue"&#160;</p>
<p><br />
</p>
<p>HorizontalAlignment="Left" VerticalAlignment="Top"/></p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/Canvas></p>
</p>
<p>&#160;</p><img src ="http://www.cnblogs.com/montaque/aggbug/1258553.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41939/" target="_blank">[新闻]搜狗五笔输入法发布</a>]]></description></item><item><title>Powershell 脚本自动下载 FTP Server上面固定格式的文件</title><link>http://www.cnblogs.com/montaque/archive/2008/06/10/1216463.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Mon, 09 Jun 2008 18:27:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/06/10/1216463.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1216463.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/06/10/1216463.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1216463.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1216463.html</trackback:ping><description><![CDATA[<p>如何用写一个bat脚本返回昨天的年月日，其实用bat写很麻烦，你要写一个For 来拿到Date的年月日，然后再写一个小程序来推算昨天的年月日。其实要使能直接执行.net代码多好，.net Datetime.Now.AddDays(-1) 就是昨天了</p>
<p>&nbsp;</p>
<p>其实Powershell就帮你回答这个问题，可以利用.net 类库丰富的功能支持，比如操作XML，文件IO，网络等特性。当然也可也自己来写一个类库，来实现复杂的脚本。</p>
<p>&nbsp;</p>
<p>这时候，你打开powershell，敲入 [DateTime]::Now</p>
<p>则返回当前的日期，如果看看Now有哪些方法和属性</p>
<p>[DateTime]::Now | get-member</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/PowershellFTPServer_A0CA/image_2.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/PowershellFTPServer_A0CA/image_thumb.png" border="0" height="362" width="484" /></a> </p>
<p>当然你要计算你长了多大的话，[DateTime]::Now-[DateTime]("yourbirthday")就返回你的年龄了，呵呵。我通常用这个来计算一下我baby几个月几天了。</p>
<p>&nbsp;</p>
<p>powershell允许你定义一个变量，针对FTP下载的问题。你首先生成你要下载的文件名，然后整理到一个String，发给FTP就可以了。</p>
<p>以下是一个简单的例子。</p>
<p>$yersterday=[DateTime]::Now.AddDays(-1);<br />
$yyyy=$yersterday.Year;<br />
$mm=$yersterday.Month;<br />
$day=$yersterday.Day;<br />
$file1=[String]::Format("90193698_{0}{1:00}{2:00}_{0}{1:00}{2:00}.zip",$yyyy,$mm,$day);&nbsp; </p>
<p>$cmd = "open yourftpserver<br />
user username password  </p>
<p>binary<br />
get $file1" </p>
<p>$cmd | ftp -i -n </p>
<p>&nbsp; </p>
<p>把他另存为一个PS1文件。 如果让他自动运行的话，写一个windows schedule task "powershell fullpathoftheps1" </p>
<p>默认poweshell有一个执行策略，不运行执行伟签名的文件。你可以改为 </p>
<p>set-ExecutionPolicy RemoteSigned </p>
<p>或者直接改一下注册表 </p>
<p>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/PowershellFTPServer_A0CA/image_4.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/PowershellFTPServer_A0CA/image_thumb_1.png" border="0" height="338" width="484" /></a>  </p>
<p>&nbsp; </p>
<p>或许这是个PS很好的一个实用例子吧。  </p>
<img src ="http://www.cnblogs.com/montaque/aggbug/1216463.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41938/" target="_blank">[新闻]新学年开始 大学生适用的十大互联网应用</a>]]></description></item><item><title>EDI batch Receiving in Biztalk 2006 R2</title><link>http://www.cnblogs.com/montaque/archive/2008/05/30/1210404.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Thu, 29 May 2008 19:02:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/30/1210404.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1210404.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/30/1210404.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1210404.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1210404.html</trackback:ping><description><![CDATA[<p><a href="http://www.cnblogs.com/montaque/archive/2008/05/30/1210392.html">EDI in Biztalk 2006 R2</a> 举了一个简单的例子。 通过裁剪满足特定vendor格式的EDI Schema，接受EDI转换成XML。</p>
<p>这时候的EDI很简单。</p>
<p>ISA*00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *01*Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ZZ*Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *070607*1555*U*00401*000000025*0*T*&gt;~<br />
<strong>GS*IN*Fedex*Montaque*20070607*1555*25*X*004010~<br />
ST*810*0025~<br />
N1*SF*COMPANY X~<br />
N3*P.O. BOX 12345~<br />
N4*ANYTOWN*OH*45678~<br />
IT1*1*0.528*TS*1.13**VP*1AGHA1223221~<br />
CTT*1~<br />
SE*7*0025~<br />
GE*1*25~<br />
</strong>IEA*1*000000025~  </p>
<p>只有一个Group,Group中只有一个Transaction Set。 如果包含多个TransactionSet,Biztalk是怎么处理呢  </p>
<p>假设EDI文件改为以下格式。一个GS中，有三个TransactionSet。  </p>
<p>ISA*00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *01*Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ZZ*Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *080529*0927*U*00401*000000014*0*T*&gt;~<br />
GS*IN*Fedex*Montaque*20080529*0927*14*T*00401~<br />
<strong>ST*810*0014~<br />
N1*SF*Montaque~<br />
N3*16839 E Gale Ave. 91745~<br />
N4*ANYTOWN*OH*45678~<br />
IT1*1*0.528*TS*1.13**VP*1AGHA1223221~<br />
CTT*1~<br />
SE*7*0014~<br />
</strong><font color="#ff0000">ST*810*0015~<br />
N1*SF*Montaque~<br />
N3*16839 E Gale Ave. 91745~<br />
N4*ANYTOWN*OH*45678~<br />
IT1*1*0.528*TS*1.13**VP*1AGHA1223221~<br />
CTT*1~<br />
SE*7*0015~</font><br />
<font color="#8080c0">ST*810*0016~<br />
N1*SF*Montaque~<br />
N3*16839 E Gale Ave. 91745~<br />
N4*ANYTOWN*OH*45678~<br />
IT1*1*0.528*TS*1.13**VP*1AGHA1223221~<br />
CTT*1~<br />
SE*7*0016~<br />
</font>GE*3*14~<br />
IEA*1*000000014~  </p>
<p>在Batch Inbound的时候，EDIReceiver Pipeline首先识别Party，然后找到该Party的Setting。默认是会Split成N个单独的消息。每个消息包含一个TransactionSet。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_2.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_thumb.png" border="0" height="388" width="484" /></a>&nbsp; </p>
<p>如果把上面的EDI丢到Biztalk的话，他会产生三个消息。</p>
<p>每个消息包含一个TS。比如</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_8.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_thumb_3.png" border="0" height="388" width="484" /></a>&nbsp;</p>
<p>而我们也可以把它设置为。Preserver interchange，后面两个选项。告诉你出错的时候，刮起对应的Interchange还是TS。</p>
<p>这时候再处理的话，就会看大他把几个消息放在一个文件中。</p>
<p>&nbsp;<a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_10.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIbatchReceivinginBiztalk2006R2_98D9/image_thumb_4.png" border="0" height="388" width="484" /></a></p>
<p>这个设置会牵涉到系统的设计。如果Vendor给一个包含10000个TS的EDI文件是启动一个Orchestration 实例处理，还是启动10000个。</p>
<p>一个的话，需要自己写一个Loop，而且load一个这么大的文件到内存。性能也不好。好处是实例数很少。</p>
<img src ="http://www.cnblogs.com/montaque/aggbug/1210404.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>EDI Party Resolution in Biztalk R2</title><link>http://www.cnblogs.com/montaque/archive/2008/05/30/1210403.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Thu, 29 May 2008 18:51:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/30/1210403.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1210403.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/30/1210403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1210403.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1210403.html</trackback:ping><description><![CDATA[<p>Biztalk 可以做EAI，也可以做B2B。 做EAI的话，是企业内部的一个信息Hub或者总线。如果做B2B的话，则相当于企业对外的一个Gateway。不同的partner有不同的平台或者标准以及设置。所以biztalk除了做集成之外，还要去管理这些契约和元数据。</p>
<p>假定企业A使用EDI来跟不同的上下游做集成和信息交换。EDI经常会问几个问题？ </p>
<ul>
    <li>这家企业使用的是那个版本？EDI有好多版本。对应到Biztalk就是我收到这家企业的EDI之后，该用哪个Schema来解释  </li>
    <li>使用X12还是EDIFact  </li>
    <li>要不要处理double posting的问题。  </li>
    <li>Batch Inbound/outbound 处理。  </li>
    <li>要不要ACK  </li>
    <li>文件格式，换行时CR，还是CRLF等。</li>
</ul>
<p>面对这个问题，Biztalk R2的EDI是通过一个新的Party识别机制来实现的。</p>
<p>每个Party都有具体的设定针对以上问题。Biztalk通过设别Party,从而应用该Party的设置。</p>
<p>我们看一下典型的EDI头。</p>
<p>ISA*00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *01*Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ZZ*Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *070607*1555*U*00401*000000025*0*T*&gt;~</p>
<p>IS5-6事实上说sender是谁？比如*01*Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>*ZZ*Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 则是说发给谁。 因为一家公司可能有不同的子公司。后面其实有00401 说明是什么版本。</p>
<p>Biztalk的Party识别就是基于这两个信息。首先看有没有一个party设置，完全匹配 Sender 和 receiver。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_2.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_thumb.png" border="0" height="387" width="484" /></a> </p>
<p>如果完全匹配，则使用该Party的设置。以上截图说明我们正好有个party叫Fedex。他的发送和接受完全匹配。设置其默认schema用来解析EDI。</p>
<p>一般来说一个party通常我们制定其Targetnamespace都一样。不同的文件，810还是850再做详细的剪裁。</p>
<p>然后如果Sender和Receiver不完全匹配。我们可能只指定Sender，Receiver为空。这时候适合一家公司下面有多个子公司，vendor发给你的时候，Biztalk作为Gateway忽略这些不同。</p>
<p>如果我们希望多个Sender来自不同的公司，使用一样的一组设置。那么可以设定QualifiedName</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_4.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_thumb_1.png" border="0" height="389" width="484" /></a> </p>
<p>如果这些都没做，那么系统会默认使用Global Setting。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_6.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_thumb_2.png" border="0" height="388" width="484" /></a> </p>
<p>如何知道接收的消息所以那个Party呢？ 一旦一个消息被解析为特定的一个party之后，该message会有一个PromotedProperty，叫做PartyName，比如下图所示。如果任何一个都没有被命中的话，则显示为Guestparty。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_8.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_thumb_3.png" border="0" height="362" width="484" /></a> </p>
<p>R2 EDI 很大程序上依赖这个party设置。包括AS2.&nbsp; 所以了解这个party解析算法很重要。 </p>
<p>&nbsp;</p>
<p>以上提到的是接受来自partner的EDI。 在party setting中称为Sender Setting。</p>
<p>如果是发送呢？</p>
<p>怎么知道该用哪个party的设置发送给Vendor？</p>
<p>这个正好反过来。你需要在系统中Promote PartyName,如果没有party的话，则会用Global的 Receiver Setting。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_10.png"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIPartyResolutioninBiztalkR2_9F71/image_thumb_4.png" border="0" height="376" width="484" /></a> </p>
<p>这里的Sender和Receiver是相对Biztalk 来说。 Sender 表示有个partner 发送消息给Biztalk。biztalk事实上是接受消息。这时候的IS5-8 是来识别Party。</p>
<p>Receiver表示有个partner需要加收Biztalk的消息。biztalk则是发消息给他。 这时候的IS5-8 是来制定EDI上的头。</p>
<img src ="http://www.cnblogs.com/montaque/aggbug/1210403.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>EDI in Biztalk 2006 R2</title><link>http://www.cnblogs.com/montaque/archive/2008/05/30/1210392.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Thu, 29 May 2008 17:32:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/30/1210392.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1210392.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/30/1210392.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1210392.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1210392.html</trackback:ping><description><![CDATA[<p>在biztalk 2006 R2中，EDI做了很大的加强。其中之一就是Party的识别算法和 EDI 由 Adpater 移到Pipeline中。</p> <p>EDI 的schema在Biztalk R2中很大，C:\Program Files\Microsoft Biztalk Server\XSD_Schema\EDI 下面有一个压缩文件。加压后大概有4G多。</p> <p>一把来说，你用哪个，把对应的schema从中加压出来。然后修改之，达到你想要的效果。一来默认的schema非常大，一个schema可能有5M左右，编译成Dll 翻倍，10M。 而.net assembly的大小不能大于75M，所以一般来说一个Dll只能包含5个左右的Schema。</p> <p>这个时候，你就要小心剪辑你的Schema文件。</p> <p>比如我有一个810 invoice的文件。如下，接下来我们一步一步的配置Biztalk ，解析成xml文件。这个EDI是版本00401，810.</p> <p>ISA*00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *00*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *01*Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ZZ*Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *070607*1555*U*00401*000000025*0*T*&gt;~<br>GS*IN*Fedex*Montaque*20070607*1555*25*X*004010~<br>ST*810*0025~<br>N1*SF*COMPANY X~<br>N3*P.O. BOX 12345~<br>N4*ANYTOWN*OH*45678~<br>IT1*1*0.528*TS*1.13**VP*1AGHA1223221~<br>CTT*1~<br>SE*7*0025~<br>GE*1*25~<br>IEA*1*000000025~  <p>&nbsp;</p> <p>我们首先从schema压缩包中解压缩这个文件。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="432" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb.png" width="484" border="0"></a> </p> <p>新建一个Biztalk的项目，把这个schema 添加进去。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_1.png" width="484" border="0"></a> </p> <p>这个schema还好1M多，接下来我们剪辑一下。假定Fedex给我们的文件，只需要ST，Nloop，CTT</p> <p>我们把其他的都删除，你可以ctl多选或者shifit所中所有的节点。删除之，把他瘦身一下。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="364" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_2.png" width="504" border="0"></a> </p> <p>Biztalk是通过schema的TargetNamespace和RootElement来区分不同的schema。由于这个schema我们是专门针对Fedex的，所以不能直接部署到biztalk。我们把他的namespace有</p> <p><a title="http://schemas.microsoft.com/BizTalk/EDI/X12/2006" href="http://schemas.microsoft.com/BizTalk/EDI/X12/2006">http://schemas.microsoft.com/BizTalk/EDI/X12/2006</a></p> <p>改为</p> <p><a title="http://schemas.microsoft.com/BizTalk/EDI/X12/2006" href="http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex">http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex</a></p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="575" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_3.png" width="541" border="0"></a> </p> <p>然后选择项目属性，给他一个AssemblyKey，部署到EDIDemo这个Application中。然后点击部署</p> <p>此时可以看到EDIDemo中有我们剪切好的Schema</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="332" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_5.png" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>Biztalk R2如果你Enable EDI的话，会默认帮你新建一个Biztalk EDI Application</p> <p>用于处理EDI的系统Schema，Pipeline，等对象都在这个Application中。</p> <p>默认我们的EDiDemo中并没有EDISend和EDIReceive的Pipiline</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="390" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_6.png" width="484" border="0"></a> </p> <p>接下来右键EDIDemo Application，选择Add-&gt;Reference，EDI Application.这时候你就可以使用这些pipeline了。</p> <p>我们首先新建一个Static one-way ReceivePort叫做 <u>ReceivePort1</u></p> <p>然后新建一个receivelocation，选择FileAdapter，PipeLine选择EDiReceive</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="390" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_7.png" width="484" border="0"></a> </p> <p>然后Enable这个ReceiveLocation。</p> <p>&nbsp;</p> <p>接着建立一个SendPort，设置一个Filter，如果从ReceivePort1来的消息，直接发出去。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_18.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="390" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_8.png" width="484" border="0"></a> </p> <p>设置一个Filter，这样不同写Orchastration来订阅这个消息。</p> <p>&nbsp;</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_20.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_9.png" width="602" border="0"></a> </p> <p>这时候先Enlist这个sendport，注意不要Enable。为了调试方便。这样的话，你就可以看到将要发出什么消息出来。</p> <p>&nbsp;</p> <p>这时候我们就可以发消息了。 把我们写好的EDI文件，Copy一份到接受目录。</p> <p>这时候不巧，消息并没有出来。看一下系统日志，有个错误。错误如下：</p> <p><br>Error encountered during parsing. The X12 transaction set with id '' contained in functional group with id '25', in interchange with id '000000025', with sender id 'Fedex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ', receiver id 'Montaque&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' is being suspended with following errors:  <p>Error: 1 (Miscellaneous error)<br>&nbsp;&nbsp;&nbsp; 6: Missing or invalid or duplicate Transaction set identifier '<a href="http://schemas.microsoft.com/BizTalk/EDI/X12/2006#X12_00401_810'">http://schemas.microsoft.com/BizTalk/EDI/X12/2006#X12_00401_810'</a>  <p>For more information, see Help and Support Center at <a href="http://go.microsoft.com/fwlink/events.asp">http://go.microsoft.com/fwlink/events.asp</a>.  <p>意思是说我们没有指定TransactionSet，这里的The X12 transaction set with id ''&nbsp; id是空。哪里出错了呢？</p> <p>接下来我们用Cordbg调试一下，一般来说在Biztalk里面使用EDI，很容易出这样那样的错误。尤其是EDI，出错了之后错误日志很模糊，由于Biztalk是个典型的.net application,我们可以通过查看异常的StackTrace,看到底发生什么了。</p> <p>run Cordbg</p> <p>Ca e</p> <p>a [Biztalk的Process]</p> <p>g</p> <p>这时候再丢一个文件进去。cordbug就看到错误了。run De,退出调试，让程序直接走。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_22.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="316" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_10.png" width="484" border="0"></a> </p> <p>意思是说EDI的Pipeline，试图用://schemas.microsoft.com/BizTalk/EDI/X12/2006#X12_00401_810 来解析这个消息。可是这个schema并没有部署。为什么呢？ 我们改了schema的namespace。 后面我会讲EDI得schema识别算法</p> <p>EDI 有四种算法来解析改用那个schema。我们什么都没有设置，所以shema是由Global EDI Setting设置的</p> <p>打开Party下面，右键Global EDI setting</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_24.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="366" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_11.png" width="484" border="0"></a> </p> <p>果然，他设置的还是旧的那个Schema。我们把它改一下</p> <p>改为 <a title="http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex" href="http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex">http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex</a></p> <p>reboot一下Biztalk Service</p> <p>然后确认，再丢一个消息进去。</p> <p>打开biztalk的管理界面，查看一下suspended instance</p> <p>就可以看到系统将要发出去的消息</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_26.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_12.png" width="484" border="0"></a> </p> <p>你可以双击查看消息的明文</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_28.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_13.png" width="644" border="0"></a> </p> <p>右键，resume这个instance。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_34.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_16.png" width="484" border="0"></a> </p> <p>然后接看到文件被发出来了。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_36.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/EDIinBiztalkR2_A597/image_thumb_17.png" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>当然这个只是一个Demo。可以写一个流程来处理该消息，比如写入数据库等。</p> <p>我们剪切了一个Schema，针对一个vendor Fedex。然后配置了全局都使用这个schema。事实上可以配置Party，不同的party使用针对他们的schema</p> <p>后面继续讲。 </p>  <img src ="http://www.cnblogs.com/montaque/aggbug/1210392.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>Hello,Biztalk 2006 R2 BAM, WCF 集成</title><link>http://www.cnblogs.com/montaque/archive/2008/05/26/1207576.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Mon, 26 May 2008 05:44:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/26/1207576.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1207576.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/26/1207576.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1207576.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1207576.html</trackback:ping><description><![CDATA[<h5><a href="http://www.cnblogs.com/montaque/archive/2008/05/24/1206258.html">Hello, Biztalk 2006 R2 BAM</a> 中提到了如何配置一个BAM的Activity模型以及通过BAM API直接把关键业务数据喂给BAM。这个适合于企业中Legacy 系统的场景。</h5> <p>&nbsp;</p> <p>接下来我们还是以上次的HelloBamActivity模型为例，配置一个WCF程序。通过添加一个Behavior，定义一个IC（interceptor Configuration）拦截模型。把WCf运行过程中的一些关键业务数据喂给BAM。</p> <p>&nbsp;</p> <p>我们首先写一个简单的WCF 程序。客户端发送一个订单到WCF 服务。订单包括State，和 Amount以及ID，这个订单的两个属性我们认为是个关键业务数据，需要提取出来反映在BAM中。</p> <p>&nbsp;</p> <p>写一个WCF 程序。 由于WCF是基于消息的应用，不像Remoting，会有对象的跨Appdomain调用，写一个remoting应用需要两个appdomain，一般来说是两个应用程序。所以很简单，我就把WCF的Client和Service 都放在一个Console程序中。 为了调试方便，采用最简单的basicHttpBinding，没有安全。这样我们可以很轻松用TCPTrace，看到消息的传递过程。编译IC中的Xpath配置。</p> <p>&nbsp;</p> <p>New一个Console Application叫做SingleWCF，添加对System.ServiceModel 和 System.Runtime.Serialization 的引用。</p> <p>然后新建一个Class，定义Contract，Service实现。代码如下：</p> <p>using System;<br>using System.Runtime.Serialization;<br>using System.ServiceModel;<br>using System.Threading;  <p>namespace SingleWCF<br>{<br>&nbsp;&nbsp;&nbsp; [DataContract()]<br>&nbsp;&nbsp;&nbsp; public class PO<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DataMember]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public float Amount;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DataMember]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string State;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DataMember]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Id;<br>&nbsp;&nbsp;&nbsp; }  <p>&nbsp;&nbsp;&nbsp; [ServiceContract()]<br>&nbsp;&nbsp;&nbsp; public interface IPOService<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [OperationContract()]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string SubmitPo(PO po);<br>&nbsp;&nbsp;&nbsp; }  <p>&nbsp;&nbsp;&nbsp; [ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]<br>&nbsp;&nbsp;&nbsp; public class POServiceImpl : IPOService<br>&nbsp;&nbsp;&nbsp; {  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region IPOService Members  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string SubmitPo(PO po)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Service get the PO");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(3000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Service Processed the PO");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return po.Id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion<br>&nbsp;&nbsp;&nbsp; }<br>}  <p>然后添加一个 APP.Config 文件。来Host这个Service。文件如下，</p> <p>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;configuration&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;system.serviceModel&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;serviceBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behavior name="enableWSDL"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;serviceMetadata httpGetEnabled="true" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behavior&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/serviceBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;services&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;service behaviorConfiguration="enableWSDL" name="SingleWCF.POServiceImpl"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpoint address="ws" binding="basicHttpBinding" bindingConfiguration="basicBindingNoSecurity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contract="SingleWCF.IPOService" behaviorConfiguration="bamBehavior" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;baseAddresses&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add baseAddress="<a href="http://localhost:8888/service&quot;">http://localhost:8888/service"</a> /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/baseAddresses&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/services&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;client&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpoint address=<a href="http://localhost:8888/service/ws">http://localhost:8888/service/ws</a> behaviorConfiguration="bamBehavior" binding="basicHttpBinding" bindingConfiguration="basicBindingNoSecurity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contract="SingleWCF.IPOService" name="clientendpoint" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/client&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bindings&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;basicHttpBinding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;binding name="basicBindingNoSecurity"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security mode="None"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/binding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/basicHttpBinding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bindings&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/system.serviceModel&gt;<br>&lt;/configuration&gt;  <p>然后来Host Service并且调用。</p> <p>using System;<br>using System.ServiceModel;<br>using System.Threading;  <p>namespace SingleWCF<br>{<br>&nbsp;&nbsp;&nbsp; class Program<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static System.Threading.ManualResetEvent mre;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mre = new ManualResetEvent(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.ThreadPool.QueueUserWorkItem(StartHost);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mre.WaitOne();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.ThreadPool.QueueUserWorkItem(StartClient);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void StartHost(object o)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceHost host = new ServiceHost(typeof(POServiceImpl));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("HostStarted");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mre.Set();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void StartClient(object o)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ChannelFactory&lt;IPOService&gt; factory = new ChannelFactory&lt;IPOService&gt;("clientendpoint");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPOService client = factory.CreateChannel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PO p=new PO();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Amount=120;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.State="WA";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Id = Guid.NewGuid().ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.SubmitPo(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("PO Sent Done");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}  <p>然后运行一下，就可以看到Service正常调用。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="316" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb.png" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>这时候把程序App.Config少许该一下，让客户端发送的目的地址由<a href="http://localhost:8888/service/ws">http://localhost:8888/service/ws</a> 端口8888改为9999，然后TCPTrace负责forward9999到8888.这样客户和服务端之间的http通讯都可以被监视到。类似Soaptoolkit的monitor工具。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="106" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_5.png" width="604" border="0"></a> </p> <p>首先启动TCPTrace，可以从 <a title="http://www.pocketsoap.com/tcptrace/" href="http://www.pocketsoap.com/tcptrace/">http://www.pocketsoap.com/tcptrace/</a> 下载。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="336" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_1.png" width="484" border="0"></a> </p><br> <p>&nbsp;</p> <p>在运行程序，就可以在TCPTrace看到消息的调用。包括发送和接受的消息。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="352" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_6.png" width="504" border="0"></a> </p> <p>到这里我们的WCF service 就写好了。接下来需要配置我们的拦截模型IC，并且部署到BAM的配置库。</p> <p>关于拦截模型。</p> <p>首先需要定义一个事件源（EventSource），比如WCF程序是一个事件源。WF程序也是一个事件源。Biztalk也是事件源。</p> <p>对于事件源，如果是.net 程序集，需要制定Assembly的fullname，如果是Biztalk，要制定是messagebox还是orchastration。</p> <p>有了事件源，需要定义一个或者多个事件模型。</p> <p>事件的定义，是通过Filter来筛选，事件发生后有要更改Activity的那些属性，通过Update来配置。另外还可以指定Reference，类似引用那个文档或者Activity。以及如何把多个事件源生成的Activity关联到一个的Continous模型。这个后面会讲。</p> <p>对于事件源，一下是一个例子。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="114" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_3.png" width="604" border="0"></a> </p> <p>对于WCF，manifest是Contract的fullname，WF，则是workflow的fullname。</p> <p>然后是一个事件的tree</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_10.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="418" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_4.png" width="704" border="0"></a> </p> <p>&nbsp;</p> <p>接下来我们配置一个我们的IC.</p> <p>我们需要配置的IC的事件源来自WCF。 </p> <p>当客户端发出一个请求的时候，并且是调用SubmitPo 的时候，我们称这个事件叫做BeginOrder。这时候拦截到State，Amount 属性。并且把当前的时间更新到Activity的BeginOrder。</p> <p>当客户端收到submitPO的时候，我们成为事件EndOrder，更新Activity的EndOrder属性。</p> <p>为了方便生成这个XML。Biztalk R2提供了三个Schema，分别面向WCF、WF，Common IC</p> <p>WcfInterceptorConfiguration.xsd</p> <p>CommonInterceptorConfiguration.xsd</p> <p>这两个文件可以在SDK目录下面找到，如果没有的话，在安装盘Msi\Program Files\SDK\Samples\BIX 下面。可以把这两个文件copy到visual studio的schema 目录下面。方便有智能提示。</p> <p>我们新建一个XML到项目中，成为wcfInterceptor.xml</p> <p>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;bam:InterceptorConfiguration xmlns:bam="<a href="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/InterceptorConfiguration&quot;">http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/InterceptorConfiguration"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:bamwcf="<a href="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/WcfInterceptorConfiguration&quot;">http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/WcfInterceptorConfiguration"</a>&gt;<br>&lt;/bam:InterceptorConfiguration&gt;  <p>这时候按照智能提示，大多数配置可以轻松搞定。</p> <p>定义一个事件源</p> <p>&lt;bam:EventSource Manifest="SingleWCF.IPOService, SingleWCF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Name="wcfSource" Technology="WCF"&gt;<br>&lt;/bam:EventSource&gt;  <p>注意这里的manifest是fullname，wcf程序在运行的时候会根据当前endpoint所绑定的contract的全名去数据库中选招match的ic。如果manifest写错了的话，你就得不到任何BAM数据。</p> <p>&nbsp;</p> <p>然后定义第一个事件。条件是：</p> <p>ClientRequest 一个Operation是SubmitPo&nbsp; <p>对应成语法是GetServiceContractCallPoint()=ClientRequest And GetOperationName()="SubmitPO"  <p>IC 采用一个特殊的语法，叫做反向表达式。就是操作数在前，操作符在后。比如我们计算2+3&#215;4 写作 234&#215;+  <p>WCF 有一些特殊的Operation，比如：  <p>AutoGenerateCorrelationToken<br>GetContextProperty<br>GetEndpointName<br>GetOperationName //返回当前的调用的Contract的Operation<br>GetServiceContractCallPoint//调用拦截点。是ClientRequest还是ServiceReply<br>XPath//从message中抓数据。  <p>这些可以从MSDN看到返回值和使用方式。</p> <p>&nbsp;</p> <p>对应成ic的xml就是  <p>&lt;bam:OnEvent Name="BeginOrder" IsBegin="true" IsEnd="false" Source="wcfSource"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetServiceContractCallPoint"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;ClientRequest&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetOperationName"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;SubmitPo&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="And"&gt;&lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:CorrelationID&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //*[local-name(.)='Id']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="BeginOrder" Type="DATETIME"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetContextProperty"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;EventTime&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="State" Type="NVARCHAR"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;//*[local-name(.)='State']&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="Amount" Type="FLOAT"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;//*[local-name(.)='Amount']&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp; &lt;/bam:OnEvent&gt;  <p>其中有一个element是CorrelationID，相当于Activity的PK值。不同的事件触发如何关联到一个Activity  <p>接下来定义另外一个事件，服务返回。更新EndOrder时间。  <p>&lt;bam:OnEvent Name="EndOrder" IsBegin="false" IsEnd="true" Source="wcfSource"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetServiceContractCallPoint"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;ServiceReply&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //*[local-name(.)='SubmitPoResult']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="EndOrder" Type="DATETIME"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetContextProperty"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;EventTime&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp; &lt;/bam:OnEvent&gt;  <p>&nbsp;</p> <p>请注意CorrelationID 的两个写法。从TCPTrace中可以看到这两个值对应一个请求。</p> <p>写好这个IC之后，通过BM.exe部署</p> <p>bm deploy-interceptor -filename:"xxx\SingleWCF\wcfInterceptor.xml"  <p>这样IC模型就部署到BAM的元数据库中。你可以查询  <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="526" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_7.png" width="704" border="0"></a></p> <p>数据中记录了该IC对应的Activity，以及事件的XML描述。</p> <p>&nbsp;</p> <p>接下来我们要配置WCF程序，enable 一个BAM提供的EndpointBehavior，来横向拦截IC模型的数据。</p> <p>右键 app.config,选择用EDIT with WCF Configuration.</p> <p>Advance-&gt; Extensions-&gt;new behavior element extension</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_18.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="546" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_8.png" width="759" border="0"></a> </p> <p>新建一个Element 叫做bamEndpoinBehavior 名字可以自己随便输入。</p> <p>Type 是Microsoft.BizTalk.Bam.Interceptors.Wcf.BamEndpointBehavior, Microsoft.BizTalk.Bam.Interceptors, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</p> <p>当然你可以点击Browser，定位到Gac中的Microsoft.BizTalk.Bam.Interceptors 程序集。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_22.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="103" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_10.png" width="244" border="0"></a> </p> <p>接下来新建一个EndpointBehavior叫做bamBehavior。把新建好的Element拖进去。配置</p> <p>BAM数据连接字符串：指向本地BAM数据库</p> <p>以及Polling的时间，写5，代表没5秒查询数据库看有没有新的IC定义。</p> <p>然后配置service和client endpoint使用该behavior</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_24.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="224" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_11.png" width="484" border="0"></a> </p> <p>此时完整的App.config</p> <p>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;configuration&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;system.serviceModel&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extensions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behaviorExtensions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="bamEndpointBehavior" type="Microsoft.BizTalk.Bam.Interceptors.Wcf.BamEndpointBehavior, Microsoft.BizTalk.Bam.Interceptors, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behaviorExtensions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/extensions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpointBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behavior name="bamBehavior"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamEndpointBehavior ConnectionString="Data Source=.;Initial Catalog=bamprimaryimport;Integrated Security=True"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PollingIntervalSec="5" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behavior&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/endpointBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;serviceBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;behavior name="enableWSDL"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;serviceMetadata httpGetEnabled="true" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behavior&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/serviceBehaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/behaviors&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;services&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;service behaviorConfiguration="enableWSDL" name="SingleWCF.POServiceImpl"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpoint address="ws" binding="basicHttpBinding" bindingConfiguration="basicBindingNoSecurity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contract="SingleWCF.IPOService" behaviorConfiguration="bamBehavior" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;baseAddresses&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add baseAddress="<a href="http://localhost:8888/service&quot;">http://localhost:8888/service"</a> /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/baseAddresses&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/services&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;client&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpoint address="<a href="http://localhost:9999/service/ws&quot;">http://localhost:9999/service/ws"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; behaviorConfiguration="bamBehavior" binding="basicHttpBinding"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bindingConfiguration="basicBindingNoSecurity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contract="SingleWCF.IPOService" name="clientendpoint" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/client&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bindings&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;basicHttpBinding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;binding name="basicBindingNoSecurity"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security mode="None"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/binding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/basicHttpBinding&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bindings&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/system.serviceModel&gt;<br>&lt;/configuration&gt;  <p>&nbsp;</p> <p>大功告成了,Run 一下应用程序。然后打开BAM portal， <a href="http://localhost/bam">http://localhost/bam</a> 就可以看到数据进去了。</p> <p>beginorder，endorder之间相差3秒左右。应为我们程序休息了3秒。 state是WA，amount是120.这些都是WCF 提供的数据。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_26.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="509" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_12.png" width="704" border="0"></a> </p> <p>&nbsp;</p> <p>如何调试知道Event有没有被命中呢？ wcf intercepotr 采用.net标准的Trace模型。在App.config中加入</p> <p>&lt;system.diagnostics&gt;<br>&nbsp; &lt;sources&gt;<br>&nbsp;&nbsp;&nbsp; &lt;source name="Microsoft BizTalk Bam Interceptors" switchValue="All"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listeners&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="consolelistener" type="System.Diagnostics.ConsoleTraceListener"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listeners&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/source&gt;<br>&nbsp; &lt;/sources&gt;<br>&lt;/system.diagnostics&gt;  <p>注意SourceName必须是Microsoft Biz<strong>T</strong>alk Bam Interceptors  <p>我上次写成Microsoft Biztalk Bam Interceptors，结果什么也没有。debug了半天，hoho  <p>再运行程序就看到结果了。一堆日志消息。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_28.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="430" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2WCF_C1AE/image_thumb_13.png" width="658" border="0"></a> </p> <p>这样。WCF程序通过定义个interceptor模型，就可以把业务关键数据喂给bam了。</p> <p>这里是完整的模型文件。</p> <p>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;bam:InterceptorConfiguration xmlns:bam="<a href="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/InterceptorConfiguration&quot;">http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/InterceptorConfiguration"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:bamwcf="<a href="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/WcfInterceptorConfiguration&quot;">http://schemas.microsoft.com/BizTalkServer/2004/10/BAM/WcfInterceptorConfiguration"</a>&gt;  <p>&nbsp; &lt;bam:EventSource<br>&nbsp;&nbsp;&nbsp; Manifest="SingleWCF.IPOService, SingleWCF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"<br>&nbsp;&nbsp;&nbsp; Name="wcfSource" Technology="WCF"&gt;<br>&nbsp; &lt;/bam:EventSource&gt;<br>&nbsp; &lt;bam:BamActivity Name="HelloBamActivity"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;bam:OnEvent Name="BeginOrder" IsBegin="true" IsEnd="false" Source="wcfSource"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetServiceContractCallPoint"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;ClientRequest&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetOperationName"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;SubmitPo&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="And"&gt;&lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //*[local-name(.)='Id']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="BeginOrder" Type="DATETIME"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetContextProperty"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;EventTime&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="State" Type="NVARCHAR"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;//*[local-name(.)='State']&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="Amount" Type="FLOAT"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;//*[local-name(.)='Amount']&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bam:OnEvent&gt;<br>&nbsp;&nbsp;&nbsp; &lt;bam:OnEvent Name="EndOrder" IsBegin="false" IsEnd="true" Source="wcfSource"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetServiceContractCallPoint"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Constant"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Argument&gt;ServiceReply&lt;/bam:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Operation Name="Equals"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="XPath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //*[local-name(.)='SubmitPoResult']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:CorrelationID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Update DataItemName="EndOrder" Type="DATETIME"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Operation Name="GetContextProperty"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bamwcf:Argument&gt;EventTime&lt;/bamwcf:Argument&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bamwcf:Operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Expression&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bam:Update&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bam:OnEvent&gt;<br>&nbsp; &lt;/bam:BamActivity&gt;<br>&lt;/bam:InterceptorConfiguration&gt;   <img src ="http://www.cnblogs.com/montaque/aggbug/1207576.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41936/" target="_blank">[新闻]微软正在构思将Wi-Fi带入汽车</a>]]></description></item><item><title>Hello, Biztalk 2006 R2 BAM</title><link>http://www.cnblogs.com/montaque/archive/2008/05/24/1206258.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Sat, 24 May 2008 00:25:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/24/1206258.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1206258.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/24/1206258.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1206258.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1206258.html</trackback:ping><description><![CDATA[<p>Biztalk 2006 R2的BAM，允许我们很方便的让既有系统和WCF-based 系统，通过配置或者API的方式。把程序运行过程中的关键数据库push给BAM。 允许业务人员通过BAM的portal 来集中察看，甚至做分析。接下来我们首先Enable Biztalk的BAM，然后定义一个简单的活动模型。然后通过程序APi，把数据喂给他。</p> <p>&nbsp;</p> <p>首先要Enable BAM。 BAM跟BAS不一样，不依赖Sharepoint，它是基于asp.net 2.0的一个简单web应用。只要有IIS就可以，操作系统vista也可以。另外如果要enable OLAP的分析的话，需要安装SQLServer分析服务，还有集成服务(有几个package来partation大的活动表)。如果使用alert,需要安装Notification服务。</p> <p>安装的时候，选择BAM Client( Excel add-in 来定义Activity，BAM Event,就是WCF/WF的interceptor模型，Alert 是基于SQL Notification server 的provider）</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="367" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb.png" width="454" border="0"></a> </p> <p>然后配置BAM,如果你需要OLAP聚合的话，选中下面的选项。他会在分析服务中建立数据库</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="323" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_1.png" width="454" border="0"></a> </p> <p>安装好之后，你可以访问<a href="http://localhost/bam">http://localhost/bam</a> 看bam portal ，初始时空的，什么都没有。这个portal允许你自定义，关键选项都在C:\Program Files\Microsoft Biztalk Server\BAMPortal\web.config 里面。另外portal目录下面有连个访问数据库的web service。portal是对web service 的一个展现。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="328" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_2.png" width="454" border="0"></a> </p> <p>接下来你就可以用Excel 来定义一个模型。如果是2007的话，选择Office按钮-&gt;Excel Options-&gt;Add-in -&gt;Go enable BAM add-in,然后你就看到add-in 选贤卡。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_10.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="328" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_4.png" width="454" border="0"></a> </p> <p>&nbsp;</p> <p>接下来我们创建一个简单的模型。定义一个模型，用户提交订单，到订单处理结束。每个订单有订单的数量，以及来自哪个州。</p> <p>Activity的属性：BeginOrder, EndOrder,OrderAmount, State</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="339" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_5.png" width="496" border="0"></a> </p> <p>新建一个Activity，叫做HelloBamActivity. </p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="328" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_6.png" width="443" border="0"></a> </p> <p>Ok之后，Activity就好了。相当于表建好了，然后我们顶一个一个视图（KPIview)</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_7.png" width="515" border="0"></a> </p> <p>选中我们的视图</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_18.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_8.png" width="515" border="0"></a> </p> <p>然后选中所有的Column</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_20.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_9.png" width="515" border="0"></a> </p> <p>下一步，这里我们可以新建一个Alias，或者duration以及分组，跟写SQL语句一样。</p> <p>我们定义一个duration，叫做订单处理时间。(processedTime),是结束时间-开始时间。统计一下订单处理了多久。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_22.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="304" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_10.png" width="414" border="0"></a> </p> <p>然后我们定义一个聚合，定义维度和测量列</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_24.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_11.png" width="515" border="0"></a> </p> <p>新建一个维度，我们以州作为一个维度</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_26.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="433" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_12.png" width="423" border="0"></a> </p> <p>然后定义测量指标</p> <p>平均处理时间MProcessedTime，这里的聚合只能有这个五种方式。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_28.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="382" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_13.png" width="411" border="0"></a> </p> <p>就这样吧，一直Next。 </p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_30.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="539" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_14.png" width="772" border="0"></a> </p> <p>然后我们选中我们的维度和测量值。Excel帮你生成了个模拟数据。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_32.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="539" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_15.png" width="772" border="0"></a> </p> <p>然后到Add-in， 点击右边的按钮，告诉我我需要一个分析的olap。</p> <p>然后点击Export Xml，到处一个Activity的定义文件。放到C:\temp\HelloBamActivity.xml</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_34.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="539" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_16.png" width="772" border="0"></a> </p> <p>至此，activity就定义好了。接下来我们把它部署到BAM的数据库中。bm.exe 是一个命令行工具，来管理BAM的模型。我们先部署一个activity模型。</p> <p>C:\Program Files\Microsoft Biztalk Server\Tracking&gt;BM.exe </p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_38.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="116" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_18.png" width="404" border="0"></a> </p> <p>如果部署提醒你Star Schema不存在的话，说明你没有配好分析服务。</p> <p>这时候你打开Portal ，就可以看到你的视图了。只是没有数据而已，</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_40.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_19.png" width="484" border="0"></a> </p> <p>这时候在数据库里面，BamPrimaryImport就建立了一些表和视图。主要是这个Activity的元数据，以及存放实例的表。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_42.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="466" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_20.png" width="704" border="0"></a> </p> <p>Select * from dbo.bam_Metadata_Activities  <p>返回activity列表。</p> <p>&nbsp;</p> <p>接下来我们就要用API，往里面写一些关键的业务数据， 比如订单的开始时间，结束时间，以及州和数量。</p> <p>新建一个Console Application</p> <p>添加对C:\Program Files\Microsoft Biztalk Server\Tracking\Microsoft.BizTalk.Bam.EventObservation.dll的引用。这个Assembly 包含直接操作BAM的API。</p> <p>&nbsp;</p> <p>我们无非是begin一个Activity，更新他的一些属性，然后退出。</p> <p>代码如下</p> <p>&nbsp;</p> <p>//begin a Astivity<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string dbConn="server=.;database=BamPrimaryImport;trusted_connection=yes";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectEventStream des = new DirectEventStream(dbConn, 5);  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string activityId=Guid.NewGuid().ToString(); //Activity Id, can be any key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; des.BeginActivity("HelloBamActivity",activityId);  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debugger.Break();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //update atribute  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; des.UpdateActivity("HelloBamActivity", activityId, "BeginOrder", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime.Now,"Amount",300,"State","CA");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; des.UpdateActivity("HelloBamActivity", activityId, "EndOrder",DateTime.Now.AddSeconds(10));  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; des.EndActivity("HelloBamActivity", activityId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; des.Flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end activiity  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();  <p>&nbsp; <p>如果要查看Trace的话，配置你的app.config,  <p>&nbsp; <p>&lt;system.diagnostics&gt;<br>&nbsp;&nbsp;&nbsp; &lt;switches&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="Microsoft.BizTalk.Bam.EventObservation" value="1"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/switches&gt;<br>&nbsp;&nbsp;&nbsp; &lt;trace autoflush="true"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listeners&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="console" type="System.Diagnostics.ConsoleTraceListener"&gt;&lt;/add&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listeners&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/trace&gt;<br>&nbsp; &lt;/system.diagnostics&gt; <p>&nbsp; <p>打开Portal就会看到数据了，多运行几次数据就可以看到更多的结果</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_44.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="509" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_21.png" width="704" border="0"></a> </p> <p>Olap 聚合</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_46.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="509" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/HelloBiztalk2006R2BAM_F39E/image_thumb_22.png" width="704" border="0"></a> </p> <p>如果看不到数据，检查一下你的集成服务的package是不是不能正常运行。</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>这样，我们可以通过了程序API的方式，把系统的业务数据push到BAM，下次讲一下怎么用配置的方式，让WCF 拦截数据到BAM</p><img src ="http://www.cnblogs.com/montaque/aggbug/1206258.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item><item><title>what's new in Biztalk 2006 R2</title><link>http://www.cnblogs.com/montaque/archive/2008/05/24/1206248.html</link><dc:creator>montaque</dc:creator><author>montaque</author><pubDate>Fri, 23 May 2008 21:53:00 GMT</pubDate><guid>http://www.cnblogs.com/montaque/archive/2008/05/24/1206248.html</guid><wfw:comment>http://www.cnblogs.com/montaque/comments/1206248.html</wfw:comment><comments>http://www.cnblogs.com/montaque/archive/2008/05/24/1206248.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/montaque/comments/commentRss/1206248.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/montaque/services/trackbacks/1206248.html</trackback:ping><description><![CDATA[<p>Biztalk 2006 R2是Biztalk 产品到目前为止，最新的版本。R3 还没有正式出来，R3 出来之后就可以跟VS 2008 集成，包括Oslo的支持。据说R3之后的版本才会基于 workflow Foundation Service。所谓计划赶不上变化， PDC 2005 的时候，Microsoft就宣布下一个版本会基于Workflow Foundation。 之后出来2006, 2006 R2,马上 2006 R3，谁知道那个版本才会基于workflow foundation。</p> <p>为什么说一定要给予Workflow foundation呢？我们知道.net framework 3.0 是个很好的平台。你基于WCF这套可扩展的模型，任何的协议，商业package都可以类似搭积木，陪协议栈一样去集成。 基于WF， 虽然workflow foundation只是个工作流的平台，没有biztalk的 可扩展稳定的消息处理引擎，可视化mapping，基于主题事实的路由，可是有一个非常简单的扩展模型，就是让你的Activity可以自由扩展。这一点也是Biztalk 改进的目标之一，就是biztalk中的Shape 远没有workflow foundation的activity 那么可扩展和定制。</p> <p>具体展开的几个Blog</p> <ul> <li><a href="http://www.cnblogs.com/montaque/archive/2008/05/24/1206258.html">Hello, Biztalk 2006 R2 BAM</a></li> <li><a href="http://www.cnblogs.com/montaque/archive/2008/05/26/1207576.html">Hello,Biztalk 2006 R2 BAM, WCF 集成</a></li> <li><a href="http://www.cnblogs.com/montaque/archive/2008/05/30/1210392.html">EDI in Biztalk 2006 R2</a></li> <li><a href="http://www.cnblogs.com/montaque/archive/2008/05/30/1210403.html">EDI Party Resolution in Biztalk R2</a></li> <li><a href="http://www.cnblogs.com/montaque/archive/2008/05/30/1210404.html">EDI batch Receiving in Biztalk 2006 R2</a></li></ul> <p><u>WCF的支持。</u></p> <p>biztalk 2006 R2 很重要的一点就是引入了对WCF的支持， 这个不是个简单的替换web service 支持的问题。更重要的是引入了一个让你自由扩展对各种系统集成的机会。 在R2之前你要写一个Adapter，比如写一个支持SAP 的adapter是非常的困难。而到了R2只好，你要扩展一个LOB 的支持，不需要去重写一个Adpater，只要利用 <u><a href="http://www.cnblogs.com/montaque/archive/2007/11/07/951950.html">WCF Adapter Framework</a> </u>像是扩展WCF的Binding，Behavior一样。利用Biztak对WCF的支持（元数据，不同的安全要求，不同的Binding）， 把你重写的wcf行为配置进去就可以了。 为此，R2的几个LOB Adapter 都是用这种新的模型重写了。会有哪些好处呢？</p> <ol> <li>写一次，能够被Biztalk 支持，以及一切能够跟WCF 通讯的Client支持。不想以前写的Adapter，只能够Biztalk使用。所以现在.net 开发人员除了可以用.NET SAP Connector跟SAP集成。也可以用SAp Adapter for Biztalk r2  <li>开发人员和管理人员使用一直的管理和配置界面。无非要回答使用那个Opeartion，点击生成Proxy的问题。 </li></ol> <p>一下是SAP Adapter for Biztalk 2006 R2的架构</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/whatsnewinBiztalk2006R2_D08A/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="455" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/whatsnewinBiztalk2006R2_D08A/image_thumb.png" width="304" border="0"></a> </p> <p>而之前的呢？</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/whatsnewinBiztalk2006R2_D08A/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="204" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/montaque/WindowsLiveWriter/whatsnewinBiztalk2006R2_D08A/image_thumb_1.png" width="304" border="0"></a> </p> <p>&nbsp;</p> <p>通过 WCF 跟Biztalk集成，相对于Web service，还有哪些好处呢？</p> <p>使用soap adapter的时候，在run-time 每次都要有两次序列华，反序列化动态编译程序集的问题。到了WCF，Biztalk 和WCf直接就是直接的消息传递。 WCF 的CLient直接送消息给Biztalk，反之亦然。</p> <p>下次我会讲一下各种WCF跟Biztalk集成的场景和方式。 相对于web service，非常之灵活。 比如，WCF可以控制消息的layout。对应MessageContract，还是DataContract，或者XmlSerilaizer 序列化方式。 使用WCF，有些Binding支持事务，可以从service调用段flow事务到Biztalk。 等等。</p> <p>&nbsp;</p> <p><u>BAM的增强</u></p> <p>Biztalk可以把异种系统，自治的Service 集成起来。run-time的时候，很多消息流来流去，往返于不同的系统。可能是WCF的服务，或者WF的流程，或者legacy 系统，当然还有Biztalk。 怎么样有一个一致的视图能够告诉用户这些消息流转是否正常，处理能力证明样，Latency有多大？ 类似回答一个KPI的问题。希望有那么一个dashboard，用户一看就知道订单处理了多少，那个州的订单额度比较大，比较赚钱？ 而要回答这样的一个问题，可能就要到不同的系统中抓数据。能不能够定义一个模型，让各个系统把关键数据按照定义好的关注模型push给中央呢。从Biztlak 2004 的时候，biztalk里面就有了个BAM，2004的时候只支持从流程中提取一些数据， 2006 支持到流程中的消息，而在R2的时候，支持到WCF、WF以及Legacy系统。</p> <p>由于WCF本省就容易扩展，所以BAM R2 提供了一个EndpointBehavior，配置到WCF。这样WCF 在运行的时候，根据你定义的关注或者拦截模型，就会自动把你关注的数据推给Centrol。</p> <p>WF也一样，Workflow本省有一个Service扩展模型，BAM R2 提供了一个BAmTrackingService，随着workflow的运行，被命中的事件和数据也会推给Centrol。 </p> <p>如果要是Legacy 系统，bam有个API。</p> <p>当然WCF、wf需要你写一个xml 配置文件来标注你对那些事件感兴趣，命中的条件以及如何更新Activity模型。</p> <p>这个xml配置文件没有图形化的配置工具，不想Biztalk的TPE。需要手动写，R2提供了schema，写起来还是很方便。</p> <p>Interceptor有一个简单的模型，让不同系统写的数据关联到一个Activity所谓的Correlation、Continous模型。下次着重写一个BAM模型。</p> <p>&nbsp;</p> <p>使用BAM帮你回答了几个问题。</p> <ul> <li>如何存储这些数据（可能会很大），交易和分析分开。自动partition  <li>访问的API，AOP的配置模型。  <li>业务人员简单定义模型。  <li>Alert模型。 </li></ul> <p>&nbsp;</p> <p>&nbsp;</p> <p><u>RFID的支持</u></p> <p>RFID其实跟Biztalk 没有关系，可以单独使用。 把你去抽象不同的厂商的FRID设备。以及受到数据之后如何派发给不同的handler，比如可能是写数据库，激活一个流程等。帮你在各种RFID设备之上做了一个抽象和简单的管理。 好像到目前，被动模式的RFID标签已经很便宜了。几分钱一个，打算买个reader 和几个标签。把标签贴到身上，在厕所门边装个reader。统计一下一年上了几次厕所，哈哈。做个报表时间，频率等等。</p> <p>&nbsp;</p> <p><u>EDI的支持。</u></p> <p>早起的Biztalk虽说支持EDI，可是Schema只有一点点。 EDI本省有好多版本，如果你用的话，只能去买Convast的完整版本。R2的时候内置了4G的Schema，比2006丰富多了。</p> <p>&nbsp;</p> <p>另外加上了AS2的支持。传统的EDI都是基于文件，Ftp。AS2基于Http</p> <p>&nbsp;</p> <p><u>关于HWS。</u></p> <p>需要人参与的workflow，在biztalk 中有个HWS，human workflow service。R2中没有做任何的加强。如果Biztalk的workflow需要人的参与，以下是集中建议的方式。</p> <p>1.用SharpointWorkflow，需要人审判和review的消息。通过sharepoint adapter，送到sharepoint站点的文档区。审批通过的话继续执行。 </p> <p>2.用自己的workflow比如windows workflow， 可以用.net framework 3.5的worklfow service，biztalk 想调用一般的wcf service 一样去调用。</p> <p>3.用商业的package，比如K2.</p><img src ="http://www.cnblogs.com/montaque/aggbug/1206248.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item></channel></rss>