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();
            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>