BizTalk 2006 R2 64-bit

As you might know, there is a 64-bit version of BizTalk 2006 R2. But there are some additional challanges when installing this version. I recently encountered strange errors when trying to configure the EDI/AS2 components. The solution was – hold on – to add the local network service account to the local admin group! The explanation seem to be that the configuration uses WMI scripts that are run under this account, and they need high permissions to run.

SSIS needed to configure BAM in BizTalk 2006?

According to the documentation (Installing and Configuring BizTalk Server in a Multicomputer Environment), you must install SQL Server 2005 Integration Services (SSIS) on the BizTalk server(s) in order to configure BAM Tools (i.e. the computer you will use to BAM Tools on). Unfortunately, this requires an extra SQL Server license… However, the documentation is not entirely accurate. You only need to install some of the SQL Client Tools, which does not require an extra server license. You should select:
 
  • Connectivity Components
  • Management Tools
  • Business Intelligence Development Studio
  • Legacy Components
 
SQL Client Components
 
(I’ve seen a report on successful installation without Busienss Intelligence Development Studio, so maybe it is not needed.)

Cannot get the BizTalk ExposeWebService sample to run on Windows XP

I had problems getting the BizTalk 2006 R2 ExposeWebService sample to run on my Windows XP machine. The published orchestration threw a SOAPException. The event log said

 

An attempt to connect to "BizTalkMgmtDb" SQL Server database on server "SE-890652" failed. Error: "Cannot open database "BizTalkMgmtDb" requested by the login. The login failed."

 

and

 

The Messaging Engine failed to register the adapter for "SOAP" for the receive location "/ExposeWebService_Proxy/Microsoft_Samples_BizTalk_ExposeWebService_ProcessClientRequest_SOAPPort.asmx". Please verify that the receive location exists, and that the isolated adapter runs under an account that has access to the BizTalk databases.

 

Clear as a cucumber. You need to add the account that the isolated adapter runs under to the BizTalk Isolated Host Users group. But which account? In Windows Server 2003 (IIS 6), you can configure the account the application pool is using, as pointed out in the documentation (ms-help://MS.BTS.2006/BTS06CoreDocs/html/b6d2377b-5a8c-4f1c-8d01-75d3f34bef6a.htm). But Windows XP (IIS 5) does not have this feature. It turns out it is the local ASPNET account that has to be added to the BizTalk Isolated Host Users group. Run IISReset before trying again. 

SharePoint Terminology

Confused by Windows SharePoint Services (WSS) terminology? Here is an attempt to straighten it out.

WSS v. 3 Term

Old Term

Class

Notes

Farm

A farm is the highest-level scope for a WSS deployment.

A farm is an installation of one of more Web servers and back-end servers.

Each farm has one and only one configuration DB.

Web application

Virtual server

SPVirtualServer

A web application is an IIS web site extended with WSS.

A web application is capable of hosting many site collections.

Site collection

Site

SPSite

The administration of a site collection can be delegated to e.g. a business division, which can create as many sites as they want.

A site collection is an island in terms of security.

A site collection is stored in one specific content DB.

A site collection is the best unit of backup and restore, and moving from development to test to production.

When a site collection is created, a top-level site is always created.

Site

Web

SPWeb

Sites can be created in a hierarchical manner.

BizTalk expressions: null or empty string?

Writing conditions containing distinguished fields in BizTalk 2004 orchestration (XLANG) can be very confusing… If an element is not supplied in the XML document and I write it to the debug log, it looks like it contains an empty string: 

System.Diagnostics.Debug.WriteLine(RegisterCustomerAccountIncoming.ExistingAccount.SystemName);

where SystemName is a distinguished field writes an empty string to the debug log, but this comparison fails:

RegisterCustomerAccountIncoming.ExistingAccount.SystemName == ""

because it really contains null! So you should really check for both null and empty string just to be sure:

RegisterCustomerAccountIncoming.ExistingAccount.SystemName == null || RegisterCustomerAccountIncoming.ExistingAccount.SystemName == ""

BizTalk Configuration Failing

Some days ago, I tried to install and configure BizTalk Server 2004 at a customer but the configuration wizard reported the following error: "Creation of Adapter FILE Configuration Store entries failed. Access is denied." There was also a an event log entry under Security that read:

Event Type: Failure Audit
Event Source:     Security
Event Category:   Logon/Logoff
Event ID:   537
Date:       2005-12-05
Time:       08:35:45
User:       NT AUTHORITYSYSTEM
Computer:   INTEGRATIONSTAG
Description:
Logon Failure:
      Reason:           An error occurred during logon
      User Name:  holsson
      Domain:           INTEGRATIONSTAG
      Logon Type: 3
      Logon Process:    Ðùê ‚^
      Authentication Package: NTLM
      Workstation Name: INTEGRATIONSTAG
      Status code:      0xC000006D
      Substatus code:   0x0
      Caller User Name: –
      Caller Domain:    –
      Caller Logon ID:  –
      Caller Process ID:      –
      Transited Services:     –
      Source Network Address: 80.69.230.67
      Source Port:      2463

First, I suspect some kind of account permission problem, perhaps relating to the fact that I was using local (rather than domain) accounts. But the real problem turned out to be the computer name! It was longer than 15 characters, which resulted in the NetBIOS name being truncated to 15 characters. When we renamed the server to a name less than 15 characters long, it worked straight away.

Binding a DataGrid in .Net

I wanted to bind a Windows form datagrid to data source which was a strongly typed (generic) collection and went into problems. So I investigated how to bind to four different datasources: a DataSet, a typed array, an untyped list (ArrayList) and a typed list (generic List). Here’s how to do it. This code also demonstrates how to customize the displayed columns. The records displayed only contains one column called "Title".
 

private void DisplayDataSet()

{

    dataSet1.Tables[0].Rows.Add("Title 1");

    dataSet1.Tables[0].Rows.Add("Title 2");

    DataGridTableStyle tableStyle = new DataGridTableStyle();

    tableStyle.MappingName = "Titles";

    DataGridColumnStyle columnStyle = new DataGridTextBoxColumn();

    columnStyle.MappingName = "Title";

    columnStyle.HeaderText = "Title";

    columnStyle.Width = dataGrid1.Width;

    tableStyle.GridColumnStyles.Add(columnStyle);

    dataGrid1.TableStyles.Add(tableStyle);

    dataGrid1.DataSource = dataSet1;

    dataGrid1.DataMember = "Titles";

}

 

private void DisplayTypedArray()

{

    Record[] titles = new Record[2];

    titles[0] = new Record("Title 3");

    titles[1] = new Record("Title 4");

    DataGridTableStyle tableStyle = new DataGridTableStyle();

    tableStyle.MappingName = "Record[]";

    DataGridColumnStyle columnStyle = new DataGridTextBoxColumn();

    columnStyle.MappingName = "Title";

    columnStyle.HeaderText = "Title";

    columnStyle.Width = dataGrid2.Width;

    tableStyle.GridColumnStyles.Add(columnStyle);

    dataGrid2.TableStyles.Add(tableStyle);

    dataGrid2.DataSource = titles;

}

 

private void DisplayArrayList()

{

    System.Collections.ArrayList titles = new System.Collections.ArrayList();

    titles.Add(new Record("Title 5"));

    titles.Add(new Record("Title 6"));

    DataGridTableStyle tableStyle = new DataGridTableStyle();

    tableStyle.MappingName = "ArrayList";

    DataGridColumnStyle columnStyle = new DataGridTextBoxColumn();

    columnStyle.MappingName = "Title";

    columnStyle.HeaderText = "Title";

    columnStyle.Width = dataGrid3.Width;

    tableStyle.GridColumnStyles.Add(columnStyle);

    dataGrid3.TableStyles.Add(tableStyle);

    dataGrid3.DataSource = titles;

}

 

private void DisplayTypedList()

{

    System.Collections.Generic.List<Record> titles = new System.Collections.Generic.List<Record>();

    titles.Add(new Record("Title 7"));

    titles.Add(new Record("Title 8"));

    DataGridTableStyle tableStyle = new DataGridTableStyle();

    tableStyle.MappingName = titles.GetType().Name;

    DataGridColumnStyle columnStyle = new DataGridTextBoxColumn();

    columnStyle.MappingName = "Title";

    columnStyle.HeaderText = "Title";

    columnStyle.Width = dataGrid4.Width;

    tableStyle.GridColumnStyles.Add(columnStyle);

    dataGrid4.TableStyles.Add(tableStyle);

    dataGrid4.DataSource = titles;

}

 

public class Record

{

    private string title;

    public string Title

    {

        get { return title; }

        set { title = value; }

    }

   

    public Record(string title)

    {

        this.title = title;

    }

}