CRM 2011 Integration How to Video #1: BizTalk On-Premise to CRM 2011

I recently participated with our MCS Canada team on a large BizTalk 2009 and CRM 4.0 integration project. I gained a ton of experience about CRM integration from that project and I thought I’d speak about it at our semi-annual TechReady internal conference. Not long before TechReady though, we release CRM 2011 and I realized that speaking about BizTalk 2009 and CRM 4.0 was about as relevant as speaking about Windows 98 and Trumpet Winsock implementations (I was reading a Slashdot article this week about the Trumpet Winsock creator so that’s where the reference came from). I hastily decided to refocus the presentation on CRM 2011 and BizTalk 2010. That meant that I had to quickly figure out exactly what the integration story was between these two products. After a bunch of trial and error and some helpful conversations with folks from the CRM 2011 team, I figure out the options. It turns out that you have TWO options for integrating BizTalk 2010 and CRM 2011.  Yes indeed, you have two different methods to choose from when integrating these two products! I ended up having a fairly relevant and well received presentation to deliver. From that internal session, I’ve repurposed my content into a publicly ready format and created a shorter walk through video that explains the two options that you have. Instead of trying to write a lengthy blog post about how to do that, I’ve just filmed a walkthrough of the process.  (I found that these video walkthroughs were highly successful when I did them for the BizTalk ESB, so I thought I’d do them again here for CRM) Also, I’ve included the source code project that I use in the video so that you can get a jumpstart on your process.

All in all, I found the process to be a very simple one once I figure out a few basic concepts. Hopefully, this blog post will help you figure out those concepts more quickly than I did. Once you’ve got a grip on those, then I believe you’ll find this integration process to be a very easy one.  As with most of these blog videos that I do, I created this after midnight when the house was quite so if you find some issues or bloopers, let me know and I’ll correct them.

Below is an overview of the components, tools and services at play in to the process. In the video, I’ll walk you through this diagram in more depth before showing you the actual project I built.  In this diagram, you can see that there is data flowing from BizTalk out to the CRM 2011 cloud service as well as data flowing from CRM 2011 Online back through the firewall to BizTalk on-premise. In this first video, I focus on the BizTalk to CRM 2011 Online option. In a day or two, I’ll post a second video that shows the CRM 2011 Online event notification being sent back to an BizTalk on-premise installation. (it’s a cool one)

This is quite a long video (>45 minutes) so I had to split it into a multipart zip file in order to get it to fit into my SkyDrive folder.

You can get:

  1. Part one at http://cid-04bc12b1f7b2979a.office.live.com/self.aspx/BlogVideos/CRMBTS%5E_Video%5E_Multi.zip
  2. Part two at http://cid-04bc12b1f7b2979a.office.live.com/self.aspx/BlogVideos/CRMBTS%5E_Video%5E_Multi.z01
  3. The source project and test file here http://cid-04bc12b1f7b2979a.office.live.com/self.aspx/BlogVideos/BizTalkToCRMOnline.zip

You’ll need to download both parts of the zip file and then use WinZip to extract them.

Cheers and stay connected people

Peter

9 New BizTalk Wencasts in the Light & Easy Series

During the MVP summit in February I managed to catch up with a few of the BizTalk MVPs who had recorded new webcasts for the “BizTalk Light & Easy” series. The 9 new webcasts are online now at CloudCasts.
%u00b7 BizTalk 2010 and Windows Azure – Paul Somers
%u00b7 BizTalk and AppFabric Cache Part 1 – Mike Stephenson
%u00b7 BizTalk and AppFabric Cache Part 2 – Mike Stephenson
%u00b7 Integration to SharePoint 2010 Part 1 – Mick Badran
%u00b7 Integration to SharePoint 2010 Part 2 – Mick Badran
%u00b7 Better BizTalk Testing by Taking Advantage of the CAT Logging Framework – Mike Stephenson
%u00b7 Calling Business Rules from a .NET Application – Alan Smith
%u00b7 Tracking Rules Execution in a .NET Application – Alan Smith
%u00b7 Publishing a Business Rules Policy as a Service – Alan Smith
The link is here. Big thanks to Paul, Mike and Mick for putting the time in.
“BizTalk Light & Easy” is an ongoing project, if you are feeling creative and would like to contribute feel free to contact me via this blog. I can email you some tips on webcasting and the best formats to use.

SharePoint 2010: Australian SharePoint Conference 2011

Firstly thanks for all that attended my 5pm – ’fireside’ session.

I definitely was a first for me having a session so late in the day. I took my shoes
off, wiggled my toes and got into it up on stage.

The session was pretty light and easy to follow along as to get bogged down into the
deep technicalities of data storage within SharePoint was going to put all to sleep.

During the session I spoke about (& demo-ed) each approach from Site/Web Property
bags, Custom Service Apps, Lists/External Lists Pros and Cons of each – all good.

Here’s my slide deck guys – Enjoy.

SLIDE
DECK – PPTX

Internal BizTalk Conference

Prior to the MVP Summit, Johan Hedberg and Mikael H%u00e5kansson stopped by Calgary and participated in a Mini-BizTalk Technical conference for my company and three other sister companies.  In addition to their presentations we had a round table discussion to find out how the other companies are using BizTalk and had two other presentations; one by myself and another by a colleague Luciano Barbieri.

 

Below you will find links to the various sessions.  I wish I would have recorded these sessions  as the demos were excellent.  Maybe next time.

Catching SOAP Faults from CRM 4.0 Web Services

Catching SOAP Faults from CRM 4.0 Web Services

A natural follow up to my BizTalk 2010: Calling Dynamics CRM 4.0 Web Services post is one that deals with the Exceptions, or Faults,  that these Web Services may return.  When using the CRM 4.0 Adapter, the adapter would take care of handling SOAP exceptions and bundling them up into a CRM Response message that had a Return Code and Error Nodes.  Whether your operation was successful or not, you could always expect the same type of response message from CRM.

<ns0:Response xmlns:ns0="http://schemas.microsoft.com/crm/BizTalkAdapter/Response">

<Header>

<ReturnCode>1</ReturnCode>

<ErrorCode />

<ErrorString />

<Retryable />

</Header>

Now that we are not using this adapter anymore we need to be able to catch our own exceptions coming out of CRM.  If we don’t perform these actions below(or similar actions) we can expect an error message like the following.

 

Inner exception: Received unexpected message type ‘http://schemas.xmlsoap.org/soap/envelope/#Fault’ does not match expected type ‘http://schemas.microsoft.com/crm/2007/WebServices#CreateResponse’.

The issue is we have a Solicit Response Send Port in which  we are sending a typed Request message into CRM and are expecting a typed Response message in return.  When we encounter a SOAP Fault, a typed message is being returned, it just isn’t what we are expecting.  In order to avoid these situations, we need to perform the following actions within our BizTalk solution. 

Note: these actions are not specific to CRM, but may be used in other Web Service scenarios.

  • Create a multi-part message that includes a part that is of type BTS.soap_envelope_1__1.Fault.  You will find this schema in the Microsoft.BizTalk.GlobalPropertySchemas assembly.

image

  • Right mouse click on your selected operation and select “New Fault Message”

image

  • Select the Message Type to be the value of our Multi-part message that we just created.

image

  • Add a scope around your send/receive shapes.  The transaction type can be “None” and the Exception Object Type should be set to the Fault that we just created within our Operation.

image

  • So while technically this is defined as a message, within our current scope exception handler it is actually an object.  So if we wanted to dump the contents of this message to the Event Viewer we could perform the following actions by assigning the message to an XML Document and then getting the OuterXml so that we can send this text into the event viewer.

image

  • At this point we can stop if we are so inclined.  If we wanted to actually use this information in our CRM Response message we can assign this “exception” object into an instance of a message that is of the same type (our multi-part message). 

image

 

  • We then can use a Message Assignment shape to assign this object into an instance of our message.

image

  • Now that we have a typed message, we can use this message in a map to instantiate an instance of our CRM Response.  To keep things simple I am just going to concatenate the faultcode, faultstring and faultactor values and assign to the CreateResult node.  If we wanted to get the actual details out, we will need to write a .Net helper method or use XSLT to extract this content out since we have an untyped “Any” node.

image

  • After all of these changes, our Orchestration should look like this:

image

  • We can now deploy our application and test it.  In order to generate a SOAP Fault, I am going to send in the same message as in my previous post, but this time I am going to make the First Name to be greater than 50 characters.

image

  • Now when we process this message, we will not get an unhandled exception or suspended message.  Instead, we will see an informational message in our event viewer that contains the details that we are interested in.

image

  • Also, we will send this error information to a folder in the form of a CreateResponse message that will include some SOAP Fault details.

<ns0:CreateResponse xmlns:ns1="http://schemas.microsoft.com/crm/2007/CoreTypes" xmlns:ns2="http://microsoft.com/wsdl/types/" xmlns:ns3="http://schemas.microsoft.com/crm/2006/Query" xmlns:ns0="http://schemas.microsoft.com/crm/2007/WebServices" xmlns:ns4="http://schemas.microsoft.com/crm/2006/Scheduling" xmlns:ns5="http://schemas.microsoft.com/crm/2006/WebServices" xmlns:ns6="http://schemas.microsoft.com/crm/2006/CoreTypes">

<ns0:CreateResult>soap:Server – Server was unable to process request. -</ns0:CreateResult>

</ns0:CreateResponse>

 

Note: some other blog posts mention using an XPATH statement, within our WCF Send Port,  for both types of messages that we are expecting; typed CRM response and SOAP Fault.  In my scenario, this step was not required since I am expecting a typed SOAP Fault exception object within my Scope – Exception handler.

image

BizTalk 2010: Calling Dynamics CRM 4.0 Web Services

BizTalk 2010: Calling Dynamics CRM 4.0 Web Services

The project that I am on ran into a critical and somewhat embarrassing situation this past week.  As we moved from a single node project environment into a multi-node test environment we discovered that the Dynamics 4.0 Adapter cannot be installed on multiple BizTalk Servers in the same group.  Yes – you read that correctly.  I have never heard of this kind of limitation and struggle with the idea the adapter was actually made available without this feature.  You can read more about this limitation in the FAQ section here.

With this in mind, we needed to quickly make a 180 degree turn.  I had heard of other people calling the ASMX CRM Web Services from BizTalk via WCF Adapter.  The process of consuming these ASMX services is much like consuming any other Web Service.  That is until you start your application and get the dreaded 401 Unauthorized error. 

 

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme ‘Negotiate’. The authentication header received from the server was ‘Negotiate,NTLM’. —> System.Net.WebException: The remote server returned an error: (401) Unauthorized

This seems like a pretty common error within the BizTalk and CRM forums.  However, I was not able find any resolutions to the issue.  It wasn’t until I started stepping through a .NET SDK sample that I realized that I was missing something and that was a required SOAP header.  For your convenience I have built an end to end sample that will walk through creating a Lead within a Dynamics 4.0 system. Keep an eye open for the Message Assignment shape where I assign this header.

  • Once we have created a BizTalk project we need to “Add Generated Items” and then select “Consume WCF Service”

image

  • Even though Dynamics 4.0 still uses ASMX style Web Services we can select “Metadata Exchange (MEX) endpoint.

image

  • Enter the location of your CRM Web Service i.e. http://server/MSCrmServices/2007/CrmService.asmx and click on the “Get” button.

image

  • Once the WSDL definition has been loaded, click the “Next” button to continue.
  • Click “Import” to create your schemas and sample Orchestration.
  • You should find that the following artifacts have been added to your BizTalk Solution.

image

  • Our “main” schema is called CrmService_schemas_microsoft_com_crm_2007_WebServices.xsd.  Within this schema you will find all of the available Actions (Create/Update/Delete/Fetch etc) and the related entities (both custom and out of box).  In this scenario we are going to create a “Lead” within our CRM system.  So we can find the “Create” node and then scroll down and find the “Lead” entity.

image 

image

  • To keep things simple, I have created a little helper message that I will use in a Map to create an instance of this CRM Create message.

image

  • Inside my map, I will simply map from this helper message to the actual CRM Request.

image

  • With the building blocks in place, the next step was to update the  Orchestration that was generated for us.  Pretty standard stuff going on here.  We want to receive an instance of our “helper” message, transform it, send the request to CRM and then write the response to disk. 

image

  • When we generated our CRM schemas, BizTalk also created a Port Type called “CrmServiceSoap” that contains all of the available operations including “Create”.

image

  • Earlier in this post I mentioned that we need to set a SOAP header on the CRM Request message.  In order to do this we want to add a Message Assignment shape after our Transformation shape.
    image
  • Within this shape we want to set the following:

msgCreateCustomer (WCF.OutboundCustomHeaders) = "<headers><CrmAuthenticationToken xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\"><AuthenticationType xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">0</AuthenticationType><OrganizationName xmlns=\"YourOrganizationhttp://schemas.microsoft.com/crm/2007/CoreTypes\">YourOrganization</OrganizationName><CallerId xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">00000000-0000-0000-0000-000000000000</CallerId></CrmAuthenticationToken></headers>";

  • The two important settings are the “AuthenticationType” and the “OrganizationName” properties.    The Authentication property can take one of three values:
    • 0 – AD
    • 1 – Passport
    • 2 – Internet Facing Deployment
  • Since this is an on-premise installation we will go with 0.
  • The “OrganizationName” property becomes extremely important in multi-tenant configurations where you may have multiple organizations or departments sharing a CRM implementation.  Since we only have 1 organization in our deployment it is safe to just set our default value.
  • It is now time to deploy and configure the BizTalk application.
  • When BizTalk generated our CRM schemas and sample Orchestration, it also generated a Binding file.  When we import the binding file we will discover that two send ports have been created.  The first is a basicHttpBinding and the second send port uses a Custom Adapter with a Custom binding.  What is the difference?  Really it comes down to some addition security configuration that is available with the Custom adapter.

image

  • Using these binding as is didn’t work for me.  I needed to change the WCF-Custom Adapter to use the basicHttpBinding.  I also had to make a few Security related changes including setting the Security “mode” was set to “TransportCredentialOnly”

image

  • I also needed to set the “clientCredentialType” to “Windows”

image

  • I wasn’t quite done here.  I also need to add an Endpoint Behavior.  In this case it was a “clientCredentials” behavior.  Within this behavior, I set “Windows” – “allowedImpersonation” = “Impersonation”

image

  • At this point, I am ready to configure the rest of the application and start it.  Once started, I can process my sample helper message.
  • Within my sample file, I have provided the following information.  Once processed by BizTalk, I expect this Lead to be created within our CRM system and the CRM response to be send to disk.

image

  • The response from CRM is a GUID.

image

  • Once we launch the Dynamics CRM GUI, I am able to find my Barry Sanders record. 

image

Conclusion

If you have high-availability requirements then I highly recommend abandoning the Dynamics CRM 4.0 adapter.  Currently, and I am not sure if there are any plans, CRM 2011 does not have an adapter so now is as good as time as any to make the move.   You can read more about CRM 2011 integration on Richard Seroter’s blog.  Also look for a chapter on CRM 2011 integration in our upcoming book.