About a year ago I published a project that helps automating documentation for BizTalk Server – much like BizTalk Documenter but with the difference that this tools instead generates a dynamic web site. I’ve called in Config Explorer, a name I knew was sh*t from the start but the best I could come up with at the time.
After a while however, when enough people told me that they also thought the name was crap I decided to change it to BizTalk Web Documenter. I’ve also moved the whole project to GitHub.
I’ll try and spend a bit more time on the project than I have the last year and will update the documentation, wiki and roadmap as well as implement a few new features.
I hope you’ll help me – fork the project today!
In the "Building Integration Solutions using BizTalk On-Premises and on Azure" on TechEd 2012 (video.ch9.ms/teched/2012/na/AZR211.pptx) is noted “ESB Toolkit as core part of BizTalk setup and product”. So I was very curious if the ESB toolkit already is implemented in the July 2012 CTP release of BizTalk 2010 R2. After configuring the BizTalk 2010 R2 virtual machine in Windows Azure I searched for the ESB toolkit but it’s not yet a part of the BizTalk setup and not on the VM. But why not installing the ESB Toolkit 2.1?
Installing the ESB Toolkit on a BizTalk machine is sometimes a challenge. I used the Installation Guide to install the core components:
1 Install the %u200b”BizTalk ESB Toolkit 2.1-x64.msi” to install the %u200bMicrosoft BizTalk ESB Toolkit and the necessary registry entries
2) Import the "Microsoft.Practices.ESB.CORE64.msi" in the BizTalk Server Administration Console
3) Configure the BizTalk ESB Toolkit Core services and components with ESB Configuration Tool in the bin directory (ESBConfigurationTool.exe)
4) Install the ESBSource.zip from the installation location to install the ESB Toolkit Sample Applications
Test the ESB Toolkit installation
To test the installation I used a small BizTalk project with 2 schemas and a map to create a BizTalk application. To send a message to one off the on-ramps that are provided by the BizTalk ESB Toolkit I used the sample “GlobalBank.ESB.Samples.Itinerary” application.
You can open the sample with Visual Studio 2012 and upgrade the projects in the solution to the new version of Visual Studio.
Run the Itinerary Test Client to send a message with an itinerary to the ESB.ItineraryServices on-ramp.
first the good news, it is possible to install the ESB Toolkit 2.1 on BizTalk 2010 R2 and you can use it to route a message to an off-ramp. I think it’s also possible to use orchestrations to extend the ESB toolkit but I didn’t test that feature. But the bad news is that you can’t use maps to transform a message! Using the TransformationService in an itinerary I’ve got the following error:
Method not found: ‘System.Xml.Xsl.XslTransform Microsoft.XLANGs.RuntimeTypes.TransformMetaData.get_Transform()’.
I compared the “get_Transform()” method in the old and the new Microsoft.XLANGs.RuntimeTypes.TransformMetaData assembly and the signatures are not the same!
The result type in BizTalk 2010 it’s “
XslTransform” and in BizTalk 2010 R2 is “XslCompiledTransform”. ESB toolkit 2.1 expects the old type resulting in the “Method not found” error.
To cut a long story short, We will have to wait for a new CTP!
Last week I was at Dreamforce (the Salesforce.com mega-conference) promoting my recently released Pluralsight course, Force.com for Developers. Salesforce.com made a HUGE effort to focus on developers this year and I had a blast working at the Pluralsight booth in the high-traffic “Dev Zone.” I would guess that nearly 75% of the questions I heard […]
Blog Post by: Richard Seroter
Simply a minor facepalm moment I want to document to help both myself and others avoid unnecessarilywasting an hour. Like I just did… You’re attempting to perform a ‘Validate Instance’ of a document against the .xsd schemadefinition, and receiving the following error: C:\path\to\sample\data.xml: warning BEC2004: Root element is missing. Step 1: Make sure to close […]
Blog Post by: Brett
This is the second in the IPASBR series, see also:
Part 2 is nice and easy. From Part 1 we exposed our service over the Azure Service Bus Relay using the netTcpRelayBinding and verified we could set up our network to listen for relayed messages. Assuming we want to consume that service in .NET from an environment which is fairly unrestricted for us, but quite restricted for attackers, we can use netTcpRelay and shared secret authentication.
This is a good fit for scenarios where:
- the consumer can run .NET in full trust
- the environment does not restrict use of external DLLs
- the runtime environment is secure enough to keep shared secrets
- the service does not need to know who is consuming it
- the service does not need to know who the end-user is
So for example, the consumer is an ASP.NET website sitting in a cloud VM or Azure worker role, where we can keep the shared secret in web.config and we don’t need to flow any identity through to the on-premise service. The service doesn’t care who the consumer or end-user is – say it’s a reference data service that provides a list of vehicle manufacturers. Provided you can authenticate with ACS and have access to Service Bus endpoint, you can use the service and it doesn’t care who you are.
In this post, we’ll consume the service from Part 1 in ASP.NET using netTcpRelay. The code for Part 2 (+ Part 1) is on GitHub here: IPASBR Part 2
Authenticating and authorizing with ACS
In this scenario the consumer is a server in a controlled environment, so we can use a shared secret to authenticate with ACS, assuming that there is governance around the environment and the codebase which will prevent the identity being compromised. From the provider’s side, we will create a dedicated service identity for this consumer, so we can lock down their permissions. The provider controls the identity, so the consumer’s rights can be revoked.
We’ll add a new service identity for the namespace in ACS , just as we did for the serviceProvider identity in Part 1. I’ve named the identity fullTrustConsumer. We then need to add a rule to map the incoming identity claim to an outgoing authorization claim that allows the identity to send messages to Service Bus (see Part 1 for a walkthrough creating Service Idenitities):
Issuer: Access Control Service
Input claim type: http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
Input claim value: fullTrustConsumer
Output claim type: net.windows.servicebus.action
Output claim value: Send
This sets up a service identity which can send messages into Service Bus, but cannot register itself as a listener, or manage the namespace.
Adding a Service Reference
The Part 2 sample client code is ready to go, but if you want to replicate the steps, you’re going to add a WSDL reference, add a reference to Microsoft.ServiceBus and sort out the ServiceModel config. In Part 1 we exposed metadata for our service, so we can browse to the WSDL locally at: http://localhost/Sixeyed.Ipasbr.Services/FormatService.svc?wsdl
If you add a Service Reference to that in a new project you’ll get a confused config section with a customBinding, and a set of unrecognized policy assertions in the namespace http://schemas.microsoft.com/netservices/2009/05/servicebus/connect. If you NuGet the ASB package (“windowsazure.servicebus”) first and add the service reference – you’ll get the same messy config.
Either way, the WSDL should have downloaded and you should have the proxy code generated. You can delete the customBinding entries and copy your config from the service’s web.config (this is already done in the sample project in Sixeyed.Ipasbr.NetTcpClient), specifying details for the client:
The proxy is straight WCF territory, and the same client can run against Azure Service Bus through any relay binding, or directly to the local network service using any WCF binding – the contract is exactly the same. The code is simple, standard WCF stuff:
using (var client = new FormatService.FormatServiceClient())
outputString = client.ReverseString(inputString);
Running the sample
First, update Solution Items\AzureConnectionDetails.xml with your service bus namespace, and your service identity credentials for the netTcpClient and the provider:
<!– ACS credentials for the full trust consumer (Part2): –>
Then rebuild the solution and verify the unit tests work. If they’re green, your service is listening through Azure. Check out the client by navigating to http://localhost:53835/Sixeyed.Ipasbr.NetTcpClient. Enter a string and hit Go! – your string will be reversed by your on-premise service, routed through Azure:
Using shared secret client credentials in this way means ACS is the identity provider for your service, and the claim which allows Send access to Service Bus is consumed by Service Bus. None of the authentication details make it through to your service, so your service is not aware who the consumer is (MSDN calls this “anonymous authentication”).
Recently the Windows Azure Storage API’s were updated to include the ability to do cross account, asynchronous blob transfers. This means it was no longer necessary to download the blob in order to upload it to a different Windows Azure account. You can read all about this here.
Over the past few weeks I have been working with the Windows Azure Virtual Machine feature that is currently in preview mode. I talked in a past blog post and video about using the Gallery to create a BizTalk 2010 R2 CTP Virtual Machine.
I am working on proving out and understanding the scenario of creating a Master Image (or Master VHD for non-domain Virtual Machines) and sharing it with a large team of developers. Why? Because on past projects we have spent considerable time and resources (i.e. money) creating, maintaining, and provisioning developer images. For example on a recent project an urgent issue arose and we needed a dedicated BizTalk environment to test a cumulative update release. It was requested on Friday morning. Still today on Wednesday it was not created (4 business days later). With Windows Azure Virtual Machines and a pre-built image this would literally be a few minute task and something I could do myself without the involvement of 3 to 5 other people. In total, so much time (i.e. money) can now be saved with Windows Azure Virtual Machines!
This type of example leads me to my tool and why I created it. In my scenario, a Windows Azure Virtual Machine guru would create a master image or vhd for distribution. With the new asynchronous cross account copy, sending an Image or VHD to a new developer is a snap… as long as you know the “rules”. I created, copied, deleted, and destroyed over 100 Virtual Machines at a total cost of around $5.00 across multiple Azure accounts to fully understand how to successfully copy an Image and VHD from one account to another without issues. I put all that into a simple tool that anyone can use to manage vhds and copy them from one account to another. See below for known issues, features of the tool, and quick how to’s.
I welcome all feedback! Please note this tool is an excellent example of why I am NOT a Windows Form guy and in no way should anything done in this tool be considered a best practice. This tool is more about getting the job done and trying to make things easy to understand.
Download: Windows Azure VHD Helper Tool
Basic Steps for Cross Account VHD Copy:
- Shut down your Virtual Machine.
- Delete your Virtual Machine.
- Delete the associated Image or Disk inside the Virtual Machine Portal. This does not remove the underlying blob of the vhd.
- Copy the blob from one storage account to another.
- Add your vhd back and recreate the virtual machine.
Issues (per my research) with VHD Copying as a Preview Feature– make sure you understand these issues and limitations. I assume most are related to preview issues and this process will get simpler with time.
- If you copy a vhd that is Leased (configured as an Image or Disk inside the Virtual Machine Portal) the Source Disk will become unusable.
- If you copy a vhd that is Leased (configured as an Image or Disk inside the Virtual Machine Portal) the Destination Disk will likely not work. I would say about 75% of the time they do not work. I just re-tested this tonight and they worked.
- Copying from one data center to another seems to be as slow as downloading the file.
- When downloading the file, make sure you do not close the form or the download will stop.
- Copy Status does not seem to be working. I either get NULL or Pending all the time. Probably a user error on my part…. The best way to find out if the copy is complete is to check the file size on the destination. It is 0 MB until the copy is complete.
- Visual view of vhds contained inside a Storage Account
- Simple, one click Delete of vhds
- Simple, one click Lease Break of vhds (for orphaned vhds – see more here)
- One click download of a vhd, tested to work with Hyper-V (downloads at a rate of about 3 MB/sec)
- Support for easily making a copy of a VHD within the same Azure account
- Support for making a vhd copy across Window Azure Accounts within the same region within a few seconds
- Support for making a vhd copy to any account in any region (slow when out of region)
- Prevents you from making a copy of a vhd with an existing Lease
- Uses the Windows Azure Storage API version 1.7.1 (github)
Advanced Features (with REST API Management Certificate):
- Visual view of all vhds contained inside a single Windows Azure Account
- See a “***” by vhds inside the Source storage account
- List all custom user images inside a single Windows Azure Account
Missing Features (i.e. items I hope to add later):
- Ability to upload a vhd
- Ability to get details on an Image
How to work with just one Storage Account:
Set just a Source Configuration inside the app.config file. I also have a check box for “source only” that will try to auto determine what you want to do. The default is Source Only.
How to Copy a vhd into the same account:
Inside the app.config file for the tool, set the Source and Destination to the same Storage Account.
How to Copy a vhd into another account in the same region (inter-account or cross-account):
Inside the app.config file for the tool, set the Source to the Storage Account that has the source vhd and set Destination to Storage Account that you want for the Destination. The destination container vhds does not need to exist. The tool will create it for you. Click “Copy”. The Destination list should refresh and the copy already be compete. You will know it is complete when the size of the vhd is not 0.
How to Copy a vhd cross region:
Inside the app.config file for the tool, set the Source to the Storage Account that has the source VHD and set Destination to Storage Account that you want for the Destination. The destination container vhds does not need to exist. The tool will create it for you. Select a vhd in the List box that is not lease. Change the vhd name if you wish. Click “Copy”. Click on “List All VHDS” on the top right until you see the file size of the Destination change from 0 to the size of the VHD. This will take a long time, up to 8 hours. I would not close the form until I have confirmed it was completed.
How to Download a Source vhd:
Inside the app.config file for the tool, set the Source to the Storage Account that has the source VHD. Click on “List All VHDS”. Select the VHD you want to download inside the List Box. Click on “Download”. You will be prompted for the download location. Make sure you have enough disk space. Leave the tool open until you see a Completed notice on the top right of the tool. This will take up to 8 hours. Do not close the form or the download will stop.
How to Break a Lease or Delete a vhd on the Source or Destination:
Inside the app.config file for the tool, set the Source and Destination to the Storage Accounts that has the VHDS. Click on “List All VHDS”. Using the List Box, select a single vhd from the list. Click on “Break VHD Lease” to break the existing lease or “Delete VHD” to delete the vhd. Note: this operations are not undoable. Using these incorrectly can result in loss of data or vhds.
I would like to thank the following references:
– How not to throw an exception using CreateIfNotExists on a container – http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob
– How to do an Azure REST API Service call – http://msdn.microsoft.com/en-us/library/windowsazure/ee460782.aspx
– How to have a 2nd thread update the main windows form – http://stackoverflow.com/questions/10775367/cross-thread-operation-not-valid-control-textbox1-accessed-from-a-thread-othe
– Async across copy with SDK 1.7.1 – http://blogs.msdn.com/b/windowsazurestorage/archive/2012/06/12/introducing-asynchronous-cross-account-copy-blob.aspx
Download: Windows Azure VHD Helper Tool
I’ve been doing some work with APIs lately and finally had the chance to dig into the ASP.NET Web API a bit more. While it’s technically brand new (released with .NET 4.5 and Visual Studio 2012), the Web API has been around in beta form for quite a bit now. For those of us who […]
Blog Post by: Richard Seroter
|One of the most famous wiki engines is MediaWiki; You may not know its name, but you may know Wikipedia which is running it!
||Un des moteurs de wiki les plus connus est MediaWiki. Vous ne connaissez peut-%u00eatre pas son nom, mais vous pouvez avoir entendu parler de Wikipedia qui l’utilise comme moteur !
|Let’s see how to install such a Wiki on Windows Azure Web Sites.
||Voyons comment installer un tel Wiki sur Windows Azure Web Sites.
|The free open source software can be downloaded from the following Url:
||Ce logiciel open source et gratuit peut %u00eatre t%u00e9l%u00e9charg%u00e9 depuis l’URL suivante :
|The file is mediawiki-1.19.2.tar.gz which can be uncompressed on Windows with a tool like 7-Zip. So let’s unblock and ungzip the file.
||Le fichier est mediawiki-1.19.2.tar.gz qui, sur Windows, peut %u00eatre d%u00e9compress%u00e9 avec l’outil 7-Zip. D%u00e9blocons et d%u00e9compressons le fichier t%u00e9l%u00e9charg%u00e9.
|Once I get the files locally, I can upload to a Windows Azure Web Site. For that, I need to create a new Windows Azure Web Site with a MySql database, by using the http://manage.windowsazure.com Windows Azure portal.
||Une fois que j’ai les fichiers localement, je peux les charger vers une site Web Windows Azure. Pour cela, j’ai besoin de cr%u00e9er un site Windows Azure et sa base MySql, en utilisant le portail Windows Azure %u00e0 http://manage.windowsazure.com.
|It is possible to reset the deployment credentials. The other parameters are available for copy from the portal.
||Il est possible de r%u00e9initialiser le mot de passe servant au d%u00e9ploiement. Les autres param%u00e8tres de d%u00e9ploiement peuvent %u00eatre copi%u00e9s depuis le portail.
|Those parameters can be pasted in an FTP client such as FileZilla. I’ll use that tool to copy the PHP files to the newly created Windows Azure Web Site.
||Ces param%u00e8tres peuvent ensuite %u00eatre coll%u00e9s dans un client FTP tel que FileZilla. C’est %u00e0 partir de cet outil que je copierai les fichiers PHP vers le nouveau site Web Windows Azure.
|It is now possible to navigate to the site. The url can be found in the Windows Azure portal.
||A ce stade, il est possible de naviguer vers le site. L’Url peut %u00eatre trouv%u00e9e dans le portail Windows Azure.
|the MySql database parameters can be found in the configure tab.
||Les param%u00e8tres de la base MySql sont disponibles dans l’onglet “configure”.
|The parameters can be copied from the connection string and pasted to the configuration web page
||Les param%u00e8tres peuvent %u00eatre copi%u00e9s de la cha%u00eene de connexion et coll%u00e9s dans la page de configuration
|This generates a php settings file that I can download
||Cela g%u00e9n%u00e8re un fichier PHP de param%u00e9trage que je peux t%u00e9l%u00e9charger
|the file should then be uploaded to the site, under the root
||le fichier peut ensuite %u00eatre charg%u00e9 dans le site, juste sous la racine
|then, I can browse the site
||Je peux ensuite aller sur le site
|In order to change the logo, besides uploading the file with FTP, PHP code needs to be changed. This can be done very easily by using WebMatrix.
||De fa%u00e7on %u00e0 changer le logo, outre le fait de charger l’image elle-m%u00eame par FTP, il faut changer du code. Cela peut %u00eatre fait tr%u00e8s facilement avec WebMatrix.
|When asked about local installation, I just click cancel in order to have the remote view only, then I edit the right file with WebMatrix editor and save.
||Quand je me vois poser la question %u00e0 propos d’une installation du site en local, je clique sur “Cancel” (annuler) de fa%u00e7on %u00e0 n’avoir que la vue du site distant. Puis j’%u00e9dite le bon fichier dans WebMatrix avant de sauvegarder.
|the site is functional. I can start modifying the content of the wiki.
||Le site est fonctionnel. Je peux modifier le contenu du wiki
Blog Post by: Benjamin GUINEBERTIERE
My personal favorite among publishers on integration is celebrating it’s 1000th title. “Join the celebration” and register before September the 30th to receive a suprise gift.
More info on the PacktPub site.
Blog Post by: Mikael Sand