Welcome to MSDN Blogs Sign in | Join | Help

BizTalk 2006 R2 Pre-requisites CAB Files

I had earlier compiled this list for BizTalk 2006 pre-requisites CAB files here.

Now that we have BizTalk 2006 R2, it needs a complete separate list of pre-requisites. The CAB files for 2006 dont work with 2006 R2.

So here is a list of those for R2 (in EN language) for a easy reference.

 

Windows 2003 Server 32 bit

http://go.microsoft.com/fwlink/?LinkId=81468

 

Windows 2003 Server 64 bit

http://go.microsoft.com/fwlink/?LinkId=81459

 

Vista 64 bit

http://go.microsoft.com/fwlink/?LinkId=81423

 

Vista 32 bit

http://go.microsoft.com/fwlink/?LinkId=81432

 

Windows XP 32 bit

http://go.microsoft.com/fwlink/?LinkId=81450

 

Windows XP 64 bit

http://go.microsoft.com/fwlink/?LinkId=81441

 

For a complete list of all the downloads in all the languages, you can use this link -

http://msdn.microsoft.com/en-us/library/aa578652.aspx

 

--Sanket

India to introduce Mobile Number Portability

In a landmark decision for the Indian telecom industry, the Department of Telecom has decided to introduce wireless Number Portability in India.

http://timesofindia.indiatimes.com/Mobile_numbers_get_mobile/articleshow/2536732.cms

It will be definitely interesting to see how this decision shapes the telecom landscape in India.

For more about Number Portability, refer to my previous post here.

Understanding window handling of IE Modal Dialogs

One of the things that I was working on in last couple of months was to do with Internet Explorer. One of the things was to explore what are the different ways in which I can host a web page within my windows app. But still interesting was the part that followed - how do I manage the IE modal dialog boxes? For instance, lets say in my MDI application, one of the dialogs display a web page. This web page opens a new modal web dialog. Now when I move to another screen in my MDI application, I want this dialog to disappear. That led me on an interesting quest to understand how the modal web dialogs behave.

Usually, the window of a modal dialog would have an owner and its modality would be restricted to that owner.  For instance, if you open a modal dialog in your windows application, the application main window owns the new modal dialog and then the dialog retains its modality only to the parent. In case of the IE modal dialogs however, these dialogs belong not to the IE window or document, but to the desktop. Yes that's exactly where it starts behaving quite unlike the normal dialogs. So if you iterate on all the windows belonging to the IE window, be assured that you will not find the modal dialogs.

This is the behavior when we use the window.ShowModalDialog() function in javascript.  In case you use the window.open() (without the modal='yes' parameter), the resulting child window will still belong to the IE window hence making it easier for you to enlist it with a EnumChildWindows() Win32 API call.

So as we see, in case of modal dialogs, things get slightly more complex. Here is the approach that we figured out in order to find all the modal dialogs for a given IE instance -

- Use the EnumChildWindows() Win32 API to enumerate all the child windows belonging to the desktop. In order to do this, the parent hWnd parameter should get its value from the GetDesktopWindow() API.

- Each EnumChildWindows() API call requires a postback that is called whenever the window is found. In this postback method, derive the process Id from the Window Handle of the dialog using the GetWindowThreadProcessId() API and then match it with your IE process.

I am not sure if there is still a better way of doing this thing. But if you know of a better way, I would be glad to take a second look here. :)

--Sanket

I am Alive

Well, just if some of you are wondering about what happened to the mere insignificant mortal who used to vent his rants in this space, let me tell you, I am still very much alive and kicking. Yeah I haven't been really active writing the stuff that I used to. But then there were a lot of other things happening as well.

First of all, since I stopped writing, I had a really nice vacation when I was off for a looonnnnggg hike to Khatling. It was a nice time. We walked for over 13 days and during that time, I got some really beautiful photographs with my new Canon Rebel XT. Yeah! that's my new baby. So as it goes, I am kind of getting hooked to photography these days and I have been spending a lot of my non-office time - nights and weekends just developing my skills with this art. Psst. Do let me know if you like my work in that space.

Apart from that, I have been pretty much disconnected with Biztalk since last 2 months. So you can guess - no new jabber. But then I have been working with .Net winforms and I think that's an exciting area as well.

A few days ago, it just dawned on me, that I was no longer active on my blog. OMG... I am not blogging! Worse, I wasn't even answering the comments. Over last couple of weeks, I had become reclusive and I had to do something about it. So I started with answering some of the comments/ queries that I had got on some of my age old posts.

Now, I know that I am really bad at sticking to resolutions, but nevertheless, here is something that I am trying one more time - In all its probabilities, you should be getting a lot more updates to this space in near future than you have been getting in the 'near' past. I might not be busy talking about Biztalk, but hey - its the dot before the Net. So almost anything I do qualifies to be here (Unless I succumb to the dark side of the 'non Microsoft world'.)

Posted by Sanket Bakshi | 3 Comments
Filed under:

Consuming webservices from within BizTalk

BizTalk 2006 allows some really good interacting with webservices. If it is a simple webservice, we can very well consume it by adding a reference to it and then consuming it using the orchestrations. Here are some interesting scenarios that I encountered when dealing with webservices.

 

Can I consume the service?

Although Biztalk offers fairly good support for consuming webservices, there are some considerations that might affect the way these interactions are developed. 

For instance, the Add Web Reference feature in BizTalk does not understand the import element in the WSDL. Multi dimensional arrays are not supported from within BizTalk & so on. An elabortate list of these considerations can be  found here.

In some cases, you might run into one of these limitations - most probably when using non .net webservices. There can be a couple of ways in which we can deal with this scenario. This webservice call can be either wrapped within a .Net component or a webservice that can in turn be consumed by BizTalk.

 

Using SOAP Headers when consuming the webservice

When consuming a webservice with SOAP headers, the headers need to be written to the context of the web request message. In order to consume these webservices from within an orchestration We need to promote a property with same name as the SOAP Header & assign it to the message context. To achieve this, create a new property schema with target namespace as http://schemas.microsoft.com/BizTalk/2003/SOAPHeader. Each root element in this schema must match the name in the defined SOAP Header. Also, each root element that corresponds to the SOAP header should have its "Property Schema Base" property set to "MessageContextPropertyBase". Setting this property ensures that the element is visible in the list of elements in the message context.

Once done, then this property can be used in the expression editor to set the property on the request message as -

 

myWebserviceRequestMsg(MyPropSchemaName.MyHeaderName) = "<?xml version='1.0'?> <MySOAPHeaderName xmlns='http://SOAPHeaderSchemas.MyHeader'> <HeaderInfo>abcxyz</HeaderInfo></MySOAPHeaderName>"

 

The myWebserviceRequestMsg can now be sent directly to the webservice along with the associated SOAP Header.

 

Using Webservice request & response messages in Mapper

Most of the times, you need to resort to transformation either for the request message - before sending to the webservice or the response message after recieving from the service. In atrading sceanrio, where the trader hosts the suppliers catalog, the orchestration would need to get the catalog from the webservice & then use the transformation to include catalog in the traders database. However, if you are thinking of creating the map directly by adding a new map, the mapper UI does not allow specifying the webmessages as source or desctination parameters.

To overcome this, we can simply use the transform shape to create a new map for us. Specifying the web response message as the input to the transform shape allows it to create a new map with the web response schema. So instead of creating a new map, just drop a transform shape in the orchestration, create two message - one with the web response schema & other of your destination schema. Open the transformation configuration page & just select new map option there. After specifying your source & destination message, a new map will be created by using those schemas.

 

Hope this alleviates some blues for anyone trying to deal with webservices from BizTalk.

--Sanket

Posted by Sanket Bakshi | 13 Comments
Filed under:

Creating public orchestrations

I am currently working on one of the Biztalk projects that contains a lot of lengthy orchestrations. In order to split them in manageable chunks, we are making intensive use of the call orchestration and start orchestration shapes. As long as the orchestrations remain in a single assembly, it works great. However, for complex solutions, it makes great sense to split these orchestrations into separate deployable assemblies - probably spanning across several BizTalk applications. 

In such cases, orchestrations in an assembly are by default not visible to orchestrations in another assembly. This is due to the default type modifier for the orchestration. The Type Modified for the orchestration is similar to the access qualifier of C#. By default this is set to "Internal". Obviously, with Internal, the orchestration is not visible outside the assembly within which it is coded. So if you are trying to call this orchestration from some other assembly which has referenced this assembly, you would need to explicitly make the orchestration "visible" outside the assembly. This can be done by setting the Type Modifier as "public".

This helps a lot in componentization of the orchestrations in a complex Biztalk solution.

Posted by Sanket Bakshi | 1 Comments
Filed under:

Adding Environment Specific Binding Files from Command Prompt

Biztalk 2006 provides the btstask utility to carry out most of the deployment operations from command prompt. However, the help available at the command prompt does not talk anything about adding environment specific binding files. 

You can get elaborate information about it on MSDN at this location.-

In order to add the environment specific binding files, you need to run btstask.exe with the -P:TargetEnvironment parameter as-

btstask AddResource -ApplicationName:MyBTSAppName -Type:System.BizTalk:BizTalkBinding -Overwrite -Source:"MyProductionBindingFile.xml" -P:TargetEnvironment="PRODUCTION"

--Sanket

Posted by Sanket Bakshi | 0 Comments
Filed under:

Alice in Wonderland

I just love what technology has done to our lives. I had never in my life thought that I would be able to read "Alice in Wonderland" the original version of Lewis Carol in his own writing.

Microsoft has just launched a version of the Turn the Pages section of the British Library for Windows Vista. It runs on the latest .Net 3.0 framework and does some really cool stuff. Take a look at it here.

I bet thats just the starting. We need to see for ourselves - how deep the rabbit hole goes :)

 

--Sanket

Posted by Sanket Bakshi | 9 Comments
Filed under:

What to and what not to do with your MessageBox database server.

The BizTalk Core Engine Team has compiled an excellent list of things that you can or cannot do on your BizTalk Message Box SQL Server.

I am sure this will be the most sought after thing by all the database administrators trying to "maintain" the Biztalk databases.

Posted by Sanket Bakshi | 0 Comments
Filed under:

Publishing Biztalk Orchestrations as webservices

When developing Biztalk applications that are exposed as webservices, it becomes quite a tedious job to expose them as webservices everytime there is a change in the orchestration. Even though Visual Studio integrates the BizTalk Web Service Publishing Wizard, it is definitely a cumbersome tool to use everytime.

To minimize the efforts, we can have a simple batch file that can do the job for us. Biztalk comes with a command line utility - btswebsvcpub.exe

Here is an example of how you can achieve this on the command prompt -

 

btswebsvcpub "C:\TestOrchSolution\TestOrch \bin\Deployment\MyTestOrch.dll" -Overwrite -Anonymous -TargetNamespace:http://testorch /service -ReceiveLocation -ApplicationName:MyTestApp

 

Furthermore, you can also use this trick for quickly deploying your assemblies from one environment to the other.

Posted by Sanket Bakshi | 7 Comments
Filed under:

Biztalk Assembly Deployment goof-up

This, to me, seems a rare scenario that you might encounter.

But if you are using the "ReDeploy" feature in the Biztalk project (from Visual Studio) you might bump into this sometimes. When debugging your orchestration with HAT, you might encounter some strange behaviour - Biztalk simply skips some steps when performing the execution. You might notice something similar to this in the HAT -

 

The problem here is quite simple. When deploying a Biztalk artifact it is deployed in the GAC and also in one of the Biztalk database. The assembly in the GAC is used by the Biztalk host instance to perform the actual execution. The one in the Biztalk database is used for the tracking purpose so that it can be shown in the HAT. Now, lets say you add something to the orchestration (like I did with the Call shape immediately after the Decide) and when deploying this assembly you somehow missed the update in the database. In this case, the Biztalk Host instance does excute the newly added step and reports it to the database. However, when looking at it from the HAT, Biztalk is not aware of this step. Hence, it is shown as a blank and not executed.

I relied on the "Redeploy" property of the Biztalk project which states that it overwrites the current deployment with the new artifacts. However, it seems that redeploy does sometimes miss out the the updates either to the GAC or to the database. (Not sure of the reason why).

The best way to get out of this is to undeploy the Biztalk assemblies and also remove them from the GAC. I also realized that when I delete my Biztalk Application from the Administration Console, it does not remove the assemblies from the GAC. I had to manually remove the assemblies there. 

Simply re-deploy the application after undeploying and removing the assemblies from the GAC and you will be good to go. Hope this helps solve some confusion when you see something like this happening with your Biztalk project.

Posted by Sanket Bakshi | 1 Comments
Filed under:

Commerce Server Bloggers from MS Global Services

Amit Agrawal & Sathish CG, the Commerce experts from MGSI, have recently started blogging.

Now, you can find them posting some cool Commerce Server related stuff on their blogs.

Amit Agrawal - http://blogs.msdn.com/amitag

Sathish CG - http://blogs.msdn.com/sathishcg

 

--Sanket

Posted by Sanket Bakshi | 0 Comments
Filed under:

Resolving "Unknown Errors" when working with Commerce Server Profile Adapter

Most of the times, when you encounter an error interacting with Commerce Server Profiles Adapter, the Adapter will give you back an error with a proper description of what might've went wrong. However, there are certain cases when the adapter simply emits a warning in the event log that mentions about an error with "Unknown Error Description".

This one seems quite tough to solve at the first instance, given that we do not have any further information about this. However, most of the times, as I noticed it this is more to do with some missing values in the message or some mis-configured properties on your send port.

To get the actual description of the error that has occured, you can do the following -

  • On the commerce server, create a new Profiles Webservice by inheriting from Microsoft.CommerceServer.Profiles.WebService.ProfilesWebService.
  • Now simply override the ImportProfile and UpdateProfile methods and call the base methods in them.
  • On the Biztalk Server, instead of pointing to the default Commerce Server Profile Webservice, point to your newly created webservice.
  • Then in this webservice, you can put a break-point and see why it fails. The actual exception information will be provided here for all the "Unknown Error Description" issues.

Once you know the reason, then it would definitely be quite easy to deal with it.

Posted by Sanket Bakshi | 0 Comments
Filed under: ,

Associating Multiple Credit Cards when creating Commerce Server Profile using the Commerce Server Profile Adapter for BizTalk

When dealing with Commerce Server integration with BizTalk 2006, one of the requirements that I faced was to create multiple credit cards for a single profile and then link all those credit cards to that profile.
To achieve this, is a two step process. The first step involves creating the actual credit cards on the Commerce Server. This has to be done by independant calls to the Profile Adapter for each credit card. These calls are made with the "EndPoint Message Type" set as "Import Profiles" on the Send Port (either Static or Dynamic).

Once all the credit cards are created, then the profile create message needs to have the list of ids for all the credit cards created. These ids are stored in the Commerce Server SQL database in the following format -

2;<creditcardid1>;<creditcardid2>

Where the creditcard Ids are nothing but GUIDs corresponding to the keys of the actual credit card objects.

Now to send it from the Biztalk Adapter, it should be sent as multiple nodes of the <credit_card_list> type. So in the actual profile create request instead of having a list of credit cards separated by a semi-colon (;) (as might seem from the value stored in the database), each individual credit card Id should be sent as a separate node.

So the create profile request looks similar to this -

<ProfileDocument>

<UserObject>

<GeneralInfo>

<user_id>fc32ccb8-0672-4457-a99d-6ac01c497912</user_id>

<user_name>sanket</user_name>

<email_address>s@b.com</email_address>

......

<credit_card_list>ab3299c1-3d57-44e9-a99d-63451c49340e</credit_card_list>

<credit_card_list>e40234ed-ab7e-1a5c-a99d-6cbe1c49ba91</credit_card_list>

<GeneralInfo>

......................

</UserObject>

</ProfileDocument>

Hope this helps you save some time when dealing with this feature.

Posted by Sanket Bakshi | 0 Comments
Filed under: ,

Correction: "Updates Overwrite" property of Commerce Server Profiles Adapter

A couple of days ago, I had blogged here about an error on the Commerce Server Profiles adapter.

When trying out an update to the Profile, the Commerce Server Adapter returns back the following error message -

<?xml version="1.0"?>
<CommerceServerProfilesUpdateResponse>
<InvalidProfileUpdateMessage>
The message body received by the send adapter is not valid for the CommerceServerProfilesUpdate API call. Message ID: 529029a6-5954-4446-bdd3-a5b4c5051cbb. Detail: There has been an optimistic locking conflict. The object could not be saved. This occurs when someone else makes a change to the object after you have loaded the object but before you have saved the object. To force overwriting of the other user's change, set the overwriteOnConflict flag to true. Profile Name = 'Address'. Primary Key Value = '{f8ec6880-9a9a-4059-9e10-1bb1712687ba}'.
</InvalidProfileUpdateMessage>
</CommerceServerProfilesUpdateResponse>

 

The solution that I had suggested was to set the "Updates Overwrite" property on the adapter to "true". However, on exploring the avenue further, I came to know that setting this property to "true" would actually cause the Commerce Server to update all the properties for the related profile. If it is not specified as an input, then it is marked as null. This behaviour might not be desirable in most of the cases where you would not like to pass all the information. Only information that is updatable should be updated.

The "Updates Overwrite" property allows doing that by setting it to "false". However, when this propery is set to "false", the Commerce Server Webservices checks for the update timestamp on the incoming message. If the timestamp is not available or if it's value is greater than the last updated timestamp in the database, then the adapter returns back with the above error message.

To take care of this issue, all you have to do is set the "date_last_changed" & "csadapter_date_last_changed" fields in your update request message to the Commerce Server to the current datetime. This can be done by simply using the date & time functoid in the map or by distinguishing these properties and then assigning them in expression shape as -

updateRequestMessage.UserObject.ProfileSystem.date_Last_changed = System.DateTime.Now().ToString();

updateRequestMessage.UserObject.ProfileSystem.csadapter_date_Last_changed = System.DateTime.Now().ToString();

 

This will now allow you to update the profile without sending the additional information that need not be updated.

One thing that I noticed with this is that even after doing this, If I go ahead to update the profile without specifying my existing credit cards, it then deletes all the credit card links in my profile. To overcome this I have to pass the credit card ids (GUIDs) along with my user profile update message.

Posted by Sanket Bakshi | 1 Comments
Filed under: ,
More Posts Next page »
 
Page view tracker