When working with BizTalk Pipeline components, it’s a common requirement to work with context property values.
The context property key is actually XML element defined in the Property Schema, and is a combination of the name and namespace of the XML element.
To read a context property value, you use the Read method on the context object of IBaseMessage:
object Read(string strName, string strNamespace);
Now, because its so easy to make mistakes with the name and namespace (just like all other string value in your code) its very advisable to save those values as constants. Something like that:
const string EPMRRCORRELATIONTOKEN_NAME = "EpmRRCorrelationToken";
const string EPMRRCORRELATIONTOKEN_NAMESPACE = "http://schemas.microsoft.com/BizTalk/2003/system-properties";
public IBaseMessage Execute(IPipelineContext context, IBaseMessage inMsg)
{
object epmObj = inMsg.Context.Read(EPMRRCORRELATIONTOKEN_NAME, EPMRRCORRELATIONTOKEN_NAMESPACE)
if (epm != null)
{
//Do Something here
}
return outMsg;
}
More elegant way is to use the classes in Microsoft.BizTalk.GlobalPropertySchemas.dll
public IBaseMessage Execute(IPipelineContext context, IBaseMessage inMsg)
{
BTS.EpmRRCorrelationToken epm = new BTS.EpmRRCorrelationToken();
object epmObj = inMsg.Context.Read(epm.Name.Name, epm.Name.Namespace);
if (epm != null)
{
//Do Something here
}
}
You can see the benefits of the second approach with Reflector:
- The class has Type property that is the CLR object type of the context property value.
- System.Xml.XmlQualifiedName object (that have some useful method itself) include the name and namespace values.
To me it's seemes that the above is the most appropriate way, so, if you want to create your own GlobalPropertySchemas.dll follow thoes steps:
- Create a new BizTalk project
- Create a folder with the appropriate Name (ex. ESB)
- Add a new property schema (ex. ESBProperties)
- Add the context-properties (ex. ServiceName).
- complie
the results are generated classes for each context-property (ex. ESB.ServiceName)
For educational proposes, I once wrote a utility that takes a user defined BizTalk schema property and generates this class for every element so you could see what happens behind scene. also, you can extend this tool and create more "smart" classes for your own GlobalPropertySchemas.dll
So, go ahead and start using your own GlobalPropertySchemas.dll in the very same way that BizTalk artifacts are using property schema elements from inside code.
BTSPscGen.exe source-code can be download form: http://pinhask.googlepages.com/BTSProperySchemaClassGen_Source.rar
Enjoy!.