Expect to find here about .Net, latest Microsoft technologies, some non Microsoft technologies and a lot more about ME :)
BizTalk provides an out of the box job that can be configured to archive and purge BizTalk databases. But sometimes you might be in a situation where archival not necessary and you might as well save that time and simply purge the tracking data.
If you want to do that, here is a quick tip –
This stored procedure takes care of purging all the data without archiving. This link () will provide further details for BizTalk 2006 R2.
It's very handy when cleaning off the database for production go-live after performing a quick smoke test.
--Sanket
When connecting to a network file share using BizTalk File adapter, you might've noticed that just specifying "Modify" rights is not sufficient. In simple configuration terms, you would need to have a minimum of "Full Control" or the BizTalk Host Service Account. Obviously this would not gel well with the system administrators.
Tom Canter () has put down the exact permissions that you would require for the FILE adapter that would help alleviate some of the concerns for the admins.
Overall, here is what it boils down to –
For the FILE Receive Adapter
For the FILE Send Adapter
Recently, I faced some of the issues below when configuring BizTalk Disaster Recovery at one of my customers. The BizTalk solution was implemented on HyperV and since earlier clustering was not supported for SQL 2005 (BTW, it is supported now), we had to separate the Message Box database and the Management, SSO & Tracking databases to ensure better solution performance. The overall configuration looked as below –
Due to this configuration, there were some minor complications that kicked in when setting up the backup jobs.
When configuring BizTalk with the above topology, the BizTalk configuration will create a SQL Linked Server between the Management database and the Message Box database. The backup jobs resides on the management database and the linked server is supposed to help communication with message box server and facilitate the backups.
As the error message points out, the first suspect is usually to check if the RPC service is working on the message box SQL Server. If BizTalk is performing its required tasks, then chances are that the issue is elsewhere. Since DTC requires RPC. And BizTalk cannot live without DTC.
The second step is to check the Linked Server properties and ensure that the "RPC Out" property is enabled. Enabling this allows RPC communication between the servers.
Hopefully these experiences might save some time the next time you run into this configuration.
--Sanket
Another amazing feature that IE 8 has pulled out of the hat is – the Web Slices. Today, a very common way of keeping the visitors updated about what's happening on your website is using the RSS. However, maintaining these feeds usually require the websites to duplicate the data access in multiple locations – on the page as well as on the RSS feeds.
With the IE 8 web slices feature, your web site customers can now subscribe to parts of the web page which they would want to get updated about. Areas within a particular webpage can be marked as a web slice by the web developers when creating the sites.
These web slices can then be subscribed to by the web site visitors. Subscribing is as simple as clicking the green web slice button on the IE 8 toolbar when you visit the site. Once subscribed, that area can be accessible and visible through the Favorites menu. In other words you don't have to go to the website every time to see what's updated.
The possibilities are end-less – You might want to keep yourself updated about the new releases on the codeplex, or just get the latest news right in your browser window, or even watch out for the stock that you bought last week.
Web Slices for Web Developers
It is quite amazing how simple it is to build discoverable web slices for the web developers. The web slices is based on the hAtom.Microformat with a few additional properties. It uses the HTML tags with specific properties & classes to create a section of the web page that can be subscribed to. IE 8 detects the web slices by scanning for elements that use the class hSlice, have a unique id property and have at least one child using the class entry-title.
To try this out real quick – here is how you can develop your web page. Once you have your web page ready with content, determine which sections you need to expose as web slices. For those sections, simply wrap them in a div as –
<div class="hslice" id="myWebSlice">
<h2 class="entry-title">My Web Slice Title</h2>
<!-- My dynamic content goes here à
</div>
Whenever visitors visits this page in IE8, they will be able to subscribe to this web slice by clicking on the green web slice button in the IE8 toolbar. Alternatively, they can also hover over to content to get the web slice button right besides it.
Happy Browsing,
OK. So there has already been a lot of buzz about the amazing features that IE 8 now has to offer for the ultimate browsing experience. There are some articles out there which go ga-ga over the awesome feature set and then there are others who say that Microsoft is just catching up with the other players already in the market. Well, for this post, I leave the decision to you. I recently installed the IE8 and am enjoying the amazing feature set it has to offer. As I go on with exploring the features, do expect further post to contain a lot more details.
Some of the cool feature-lets (that's a term I came up with – it just says – a small feature) that I found right on the first look –
Seems Interesting? Well, why don't you try it out for yourself? Microsoft has just released the RC1 bits for IE8. You can download it here.
Let me know what you think about this.
Happy Browsing, -- Sanket
Most of the Windows machines use the automatic updates to install the latest updates from Microsoft. Recently, we ran into an issue where the Biztalk configuration started failing on one of the servers. Having to investigate if this was caused by a patch, we were looking at a quick way of figuring out if there is an easy way to get a list of the updates made to the operating system.
A quick search suggested the command line tool WMIC that can be used for this purpose. Using WMIC as below would give you the complete details of the patches that were installed on the machine -
C:\>WMIC QFE LIST
C:\>WMIC QFE LIST
WMIC is the command line interface for WMI & works from Windows XP & Windows Server 2003 onwards. Complete details for WMIC can be found here.
There is a new bloggers guide recently published by Alan Smith. This guide provides a good overview of the next wave of the connected systems technologies. It starts with the WCF & WF 4.0 and makes its way to the Biztalk 2009, Oslo, Dublin and finally even the Azure (a.k.a BizTalk Services).
Plus it includes bloggers like - Alan Smith (himself), Darren Jefford, Charles Young, Don Box, Brian Losegen, Aaron Skonnard, Jeff "Pinkey" Pinkston, Martin Fowler, Andreas Erben, Imran Shafqat.
Definitely a must-read to keep up to the CS pace. You can find the guide here.
--Sank -
In a landmark decision for the Indian telecom industry, the Department of Telecom has decided to introduce wireless Number Portability in India.
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.
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. :)
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'.)
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. 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=''> <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.
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.
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"
btstask AddResource -ApplicationName:MyBTSAppName -Type:System.BizTalk:BizTalkBinding -Overwrite -Source:"MyProductionBindingFile.xml" -P:TargetEnvironment="PRODUCTION"
--Sanket
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 :)