For a couple of years I have been tracking message-bodies inside BAM but only recently I was asked to make a BAM Portal document link to these message bodies that actually works :-)
Strangely enough I couldn't find any solution on Google so I tried to figure this one out myself. Guess what? I had to jump through quite a few hoops. I decided to share those hoops with my other 2 blog readers (yes you).
- Hoop 1: the 1st and most obvious step is getting the message bodies into the BAM tables using the eventstreams. This can be done using the AddReference method.
es.AddReference(activityName, activityID, referenceType, referenceName, referenceData, longReferenceData);
Put the body string inside longReferenceData and freely choose your referenceType and referenceName. Making referenceType unique comes in handy later because you can query on a specific referenceType thru the web service (and not on referenceName).
You should now have your body inside the BAM table (check: bam_{activityName}_AllRelationships). You can easily query his table via the BAM Management web service like this:
- Hoop 2: You need to find a way to query the BAM management web service for a specific reference through a simple link instead of a http post soap request.
Jesus and Joe's great BAM paper suggest a restful API which sounds great but unfortunately isn't a fact yet. My workaround consists of httpget-enable the web service. Adding this snippet inside the system.web section of the web.config file in the folder C:\Program Files\Microsoft BizTalk Server 2006\BAMPortal\BAMManagementService will get you exactly that:
<webServices>
<protocols>
<add name="HttpGet"/>
</protocols>
</webServices>
Now the web service sample invoke page will also show a sample 'get' request:
- Hoop 3: You need to put a link to the http get url as a 'document link' on the BAM portal. You can do this again via the stream by adding a reference of type 'DocumentUrl' and putting the relative link inside the referenceData field.
es.AddReference(activityName, activityID, 'DocumentUrl', referenceName, referenceData, "");
My link string format looks like this:
string link =
string.Format(
"/bam/bammanagementservice/bammanagementservice.asmx/GetReferences?viewName={0}&activityName={1}&activityInstanceId={2}&referenceType={3}",
"put your activity view name here",
"put your activity view name here",
"activityID here",
"referenceName here");
That's about it.
|