Custom Pipeline to Add DocType in Message

Sometimes we require to add some element, tag, DocType in incoming or outgoing message from BizTalk. We can achieve this by using custom pipeline. But we should use this pipeline component in Decode or encode stage of Pipeline.

In this sample custom pipeline, we convert the message in string. So you can take this code and change according your business requirement.

Below link is defined for Custom Pipeline setup details

https://vkbiztalk.com/2017/08/04/custom-pipeline/

Here in this sample code I have added DocType on header of message when sending the message to send port. DocType will defined at design time when consume this pipeline component on encode stage on send pipeline.

using System;

using System.IO;

using System.Text;

using System.Drawing;

using System.Resources;

using System.Reflection;

using System.Diagnostics;

using System.Collections;

using System.ComponentModel;

using Microsoft.BizTalk.Message.Interop;

using Microsoft.BizTalk.Component.Interop;

using Microsoft.BizTalk.Component;

using Microsoft.BizTalk.Messaging;

using System.IO;

using System.Xml;

 

namespace BizTalk.Custom.PipelineComponents

{

[ComponentCategory(CategoryTypes.CATID_PipelineComponent)]

[ComponentCategory(CategoryTypes.CATID_Any)]

[System.Runtime.InteropServices.Guid(“CB814714-BC81-4BDA-B361-69CA270997E8”)]

public class AddDocFileName : IBaseComponent, IComponentUI, Microsoft.BizTalk.Component.Interop.IComponent, IPersistPropertyBag

{

#region Configuration Properties

private string _DocTypeName;

public string DocTypeName

{

get

{

return _DocTypeName;

}

set

{

_DocTypeName = value;

}

}

#endregion

public string Description

{

get

{

return “Pipeline component To Add DocType in Outgoing XML”;

}

}

public string Name

{

get

{

return “AddDocNameinXML”;

}

}

public string Version

{

get

{

return “1.0.0.0”;

}

}

public IntPtr Icon

{

get

{

return new System.IntPtr();

}

}

public System.Collections.IEnumerator Validate(object projectSystem)

{

return null;

}

public void GetClassID(out Guid classID)

{

classID = new Guid(“CB814714-BC81-4BDA-B361-69CA270997E8”);

}

public void InitNew()

{

}

public virtual void Load(Microsoft.BizTalk.Component.Interop.IPropertyBag pb, int errlog)

{

object val = null;

val = this.ReadPropertyBag(pb, “DocTypeName”);

if ((val != null))

{

this._DocTypeName = ((string)(val));

}

}

public virtual void Save(Microsoft.BizTalk.Component.Interop.IPropertyBag pb, bool fClearDirty, bool fSaveAllProperties)

{

this.WritePropertyBag(pb, “DocTypeName”, this.DocTypeName);

}

#region utility functionality

/// <summary>

/// Reads property value from property bag

/// </summary>

/// <param name=”pb”>Property bag</param>

/// <param name=”propName”>Name of property</param>

/// <returns>Value of the property</returns>

private object ReadPropertyBag(Microsoft.BizTalk.Component.Interop.IPropertyBag pb, string propName)

{

object val = null;

try

{

pb.Read(propName, out val, 0);

}

catch (System.ArgumentException)

{

return val;

}

catch (System.Exception e)

{

throw new System.ApplicationException(e.Message);

}

return val;

}

/// <summary>

/// Writes property values into a property bag.

/// </summary>

/// <param name=”pb”>Property bag.</param>

/// <param name=”propName”>Name of property.</param>

/// <param name=”val”>Value of property.</param>

private void WritePropertyBag(Microsoft.BizTalk.Component.Interop.IPropertyBag pb, string propName, object val)

{

try

{

pb.Write(propName, ref val);

}

catch (System.Exception e)

{

throw new System.ApplicationException(e.Message);

}

}

#endregion

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)

{

IBaseMessagePart bodyPart = pInMsg.BodyPart;

XmlDocument xDoc = new XmlDocument();

if (bodyPart != null)

{

Stream originalStream = bodyPart.GetOriginalDataStream();

string originalDataString;

try

{

//fetch original message

Stream originalMessageStream = bodyPart.GetOriginalDataStream();

byte[] bufferOriginalMessage = new byte[originalMessageStream.Length];

originalMessageStream.Read(bufferOriginalMessage, 0, Convert.ToInt32(originalMessageStream.Length));

originalDataString = System.Text.ASCIIEncoding.ASCII.GetString(bufferOriginalMessage);

}

catch (Exception ex)

{

ex.Source = “AddDocTypePipelineComponent”;

throw ex;

}

XmlDocument originalMessageXml = new XmlDocument();

if (originalStream != null)

{

originalDataString = originalDataString.Remove(0, 41);

originalDataString = @”<?xml version=’1.0′ encoding=’UTF-8′?>” + DocTypeName + originalDataString;

byte[] outBytes = System.Text.Encoding.ASCII.GetBytes(originalDataString);

MemoryStream memStream = new MemoryStream();

memStream.Write(outBytes, 0, outBytes.Length);

memStream.Position = 0;

bodyPart.Data = memStream;

pContext.ResourceTracker.AddResource(memStream);

 

}

}

return pInMsg;

}

}

}

 

Sample Input File:

<?xml version=”1.0″ encoding=”UTF-8″?>

<Test xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema“><Name> </Name></Test>

Sample Output File:

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE Test SYSTEM “http://localhost/Test/DTD/TestDocType.dtd”&gt;

<Test xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema“><Name> </Name></Test>

 

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s