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.
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();
XmlNodeList emptyElements = xmldoc.SelectNodes(@"//*[not(node())]");
for (int i = emptyElements.Count - 1; i >= 0; i--)
xmldoc.InnerXml = xmldoc.InnerXml.Replace("", "");
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
To see how to run the full server side trace and view the output, please see this article.
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.
<dataContractSerializer maxItemsInObjectGraph=”500000″ />
<endpoint address=”http://my.address.com/Service” behaviorConfiguration=”NewBehavior”
binding=”basicHttpBinding” contract=”ITest” name=”foo” />
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.
initializeData= "c:logTraces.svclog" />
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).
Rules (with static C# routines, such as PolicyChaining, or C# code that adds nodes to the XML), are working fine on XP but not on 2003 (or working on machine and not another). For example, we have a condition of 1=1, which should always fire, but if a static C# routine is found in the actions, then the rules does not fire.
See Richard Seroter’s blog. There is a registry setting that must be set to allow business rules to call a static C# method.
Also note, if you change a C# program, and even re-GAC it, to get the Business Rule Composer to “see” the changes, you have to close and re-open the Business Rule Composer if you are using the test policy feature.
If you download the Policy-Chaining sample for BizTalk, it has an automated way of updating the registry setting. In it’s setup.bat.
@ECHO Setting the StaticSupport registry key to ONE
@REGEDIT /s AddStaticSupport.reg
The AddStaticSupport.reg include the following statements:
System.Net.WebException: Unable to connect to remote server System.et.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:80
For me, this was an easy one, IIS was down.
1) Check app.exe.config and make sure URL is corect
2) Make sure machine name is correct http://xxxxxxxx or http://localhost
BizTalk Server 2006 is not available or configured. Verify BizTalk Server 2006 on server xxxxx using management database BizTalkMgmtDb is accessible and configured with a compatible version.
This frequently occurs in the company I’m working. All development is done on VMWare virtual machines, when the systems guys do a backup of VMWare “LabManager”, the virtual machine are shutdown and then restarted. For some odd reason, after the restart, SQL frequently does not start (even though it is set as “automatic start”.
To solve the problem, go to System Services, and if SQL is not started, then start it.
How to use TextWriter to file.
string strOutFileName = @"c:YourDirYourFile.xml";
... assumes you have an xmlDoc somewhere
System.Xml.XmlTextWriter tw = new XmlTextWriter(strOutFileName, System.Text.Encoding.ASCII);
How to initialize an array of objects in C#. Often, we write C# test harnesses to populate some test data based on an object structure (which was ultimately created from an xml structure).
svcref1.WiringLoanReq req =
svcref1.WiringLoanResp resp =
svcref1.WiringLoan loan1 =
svcref1.WiringLoan loan2 =
loan1.CadenceLoanId = "0012341234";
loan1.CadenceLoanId = "0012341235";
req.WiringLoans = new TMAC.Wiring.UnitTest.CallPublishedOrch.svcref1.WiringLoan;
req.WiringLoans = loan1;
req.WiringLoans = loan2;
// call the web service
resp = client.getWiringRequest(req);