6
votes

I have a WinForms / WCF / SQLServer app where I am trying to use MSDTC transactions like this:

using System.Transactions;

// ...

var transOptions =
    new TransactionOptions
    {
        IsolationLevel = IsolationLevel.ReadCommitted,
        Timeout = TimeSpan.FromSeconds(120)
    };

using (var scope = new TransactionScope(TransactionScopeOption.Required,
         transOptions))
{
    // ...

    if (everything_is_ok)
        scope.Complete();
}

On my dev. box, where the server and client processes are on the same machine, it works fine. But when I deploy to the QA env, where server and client are on separate machines, whenever scope.Complete() is called, the client hangs for the timeout period (2 minutes) and then I get:

The flowed transaction could not be unmarshaled. The following exception occurred: Communication with the underlying transaction manager has failed.

What can cause this?

4

4 Answers

10
votes

I spent few hours today trying to resolve this problem under Windows 7. Finally it worked, here's what I did:

  1. Enable MSDTC and allow inbound/outbound transactions (via Control Panel)
  2. The guide for opening ports via registry - just follow the guide
  3. Allow ports defined in (2) to be open in your firewall (in case you use one)
  4. Allow MSDTC through the windows firewall - add new rule for inbound connections to msdtc.exe (should be in %systemroot%\system32)

This is maybe not the best solution but in fact the only one that worked in my case.

EDIT: After another issue with MSDTC under Windows 7 SP1 I found out that there are two things you need to do in order to make it work.

  1. Add to hosts file a mapping between the IP and NetBIOS name of the server.
  2. Add (or edit) two keys at HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\RPC: "RestrictRemoteClients"=dword:00000000 "EnableAuthEpResolution"=dword:00000000
1
votes

As a further note on MSDTC, see what the Security configuration tab for MSDTC has set on the server, and make sure your local machine matches that. I ran into a problem that stumped me for a while until I did this, and found that the server expected no authentication, but my local machine was set for mutual authentication.

0
votes

you should enabled network transactions and other settings for distributed transactions in the DTC configuration.

Check this out, the answer flagged with the green icon tells you what to do in details:

"Communication with the underlying transaction manager has failed" error message