分布式事务管理器(MSDTC)的网络访问已被禁用。

29

错误:

分布式事务管理器(MSDTC)的网络访问已禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 的网络访问。

using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())   
11                 {   
12                     try  
13                     {   
14                         foreach (DataRow row in this.dt1.Rows)   
15                         {   
16                             int titleId = int.Parse(row["titleId"].ToString());   
17                             string fname = row["fname"].ToString();   
18                             string lname = row["lname"].ToString();   
19   
20                             if (cmd.Parameters.Count > 0)   
21                                 cmd.Parameters.Clear();   
22   
23                             cmd.Parameters.AddWithValue("@titleId", titleId);   
24                             cmd.Parameters.AddWithValue("@fname", fname);   
25                             cmd.Parameters.AddWithValue("@lname", lname);   
26                             cmd.ExecuteNonQuery();   
27   
28                         }   
29                         con.Close();   
30                         ts.Complete();   
31                     }   
32                     catch (Exception ex)   
33                     {   
34   
35                     }                       
36                 }   
37             }  

1
可能是重复问题:https://dev59.com/VXRA5IYBdhLWcg3w4SDo - Deano
如果是本地事务,为什么要使用DTC? - Kiquenet
3
哇,6年前的事了!此外,如果您正在使用异步操作,需要添加“TransactionScopeAsyncFlowOption.Enabled”,如下所示:using (var trans = new TransactionScope((TransactionScopeAsyncFlowOption.Enabled))) - Jin
5个回答

67
为了在Windows Vista/7/8 Server 2008R2/2012上启用对MSDTC的网络访问,请按照以下步骤操作:
1. 点击“开始”,点击“运行”,输入“dcomcnfg”,然后单击“确定”打开“组件服务”。 2. 在控制台树中,单击以展开“组件服务”,单击以展开“计算机”,单击以展开“我的电脑”,单击以展开“分布式事务协调程序”,然后单击“本地 DTC”。 3. 右键单击“本地 DTC”,单击“属性”以显示“本地 DTC 属性”对话框。 4. 单击“安全性”选项卡。 5. 选中“网络 DTC 访问”复选框。 6. 最后选中“允许入站”和“允许出站”复选框。 7. 单击“应用”、“确定”。 8. 将弹出一条有关“重新启动”服务的消息。 9. 单击“确定”,完成以上操作。

4
这的安全风险是什么?我不想盲目地开放网络访问权限,而不完全理解这意味着什么。 - jtate
你好,有人可以帮我吗?在进行了这些设置之后,我们收到了另一个错误信息。“与底层事务管理器的通信失败。”内部异常 MSDTC事务管理器由于通信问题无法从源事务管理器中获取事务。可能的原因是:存在防火墙,但它没有为MSDTC进程设置例外;两台机器无法通过它们的NetBIOS名称找到彼此;或者两个事务管理器中的一个未启用网络事务的支持。 - undefined
@EeNiArT 不确定你是否已经解决了这个问题,但是根据上面提供的少量信息,很难确定MSDTC错误的具体原因。你能否提供更多涉及的系统细节?如果你已经解决了问题,请分享解决方案。 - undefined
@Sundeep在将数据库迁移到AWS RDS时解决MSDTC错误可能是一项具有挑战性的任务。在我们的情况下,AWS RDS不支持MSDTC事务,这促使我们采取措施确保数据库的顺利运行。为了解决这个问题,我们正在积极努力从我们的代码库中移除MSDTC事务。虽然我们正在进行这个过程,取得了相当大的进展,但问题尚未完全解决。 - undefined

3

在事务范围 Complete 方法后关闭连接。

ts.Complete();
con.Close();   

完成的代码如下:

using (System.Transactions.TransactionScope ts = new  Sytem.Transactions.TransactionScope())   
{   
    try  
    {   
        foreach (DataRow row in this.dt1.Rows)   
        {   
            int titleId = int.Parse(row["titleId"].ToString());   
            string fname = row["fname"].ToString();   
            string lname = row["lname"].ToString();   

            if (cmd.Parameters.Count > 0)   
                cmd.Parameters.Clear();   

            cmd.Parameters.AddWithValue("@titleId", titleId);   
            cmd.Parameters.AddWithValue("@fname", fname);   
            cmd.Parameters.AddWithValue("@lname", lname);   
            cmd.ExecuteNonQuery();   
        }   
        ts.Complete(); 
        con.Close();     
    }   
    catch (Exception ex)   
    {   
    }                       
}    

2
在连接字符串的末尾添加Enlist=false;对我有所帮助!

0
如果有人正在查看此内容,并使用linq,则只需像这样将整个事务包装到JoinScope中:
using js = new JoinScope(false) {
    using (System.Transactions.TransactionScope ts = new Sytem.Transactions.TransactionScope()) { 
        ... 
    }
}

-1

InnerException = {"已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具在 MSDTC 的安全配置中启用网络 DTC 访问。"}

我按照以下步骤解决了本地系统上述问题:

启用网络 DTC 访问:

  1. 运行“dcomcnfg”以打开组件服务管理工具

  2. 单击“本地 DTC”并打开属性窗口

  3. 单击“安全”选项卡,并进行以下安全设置以启用网络 DTC 访问:

    启用与分布式事务协调器相关的防火墙规则(TCP-IN/TPC-)

更多详情请参见 @https://rajeevdotnet.blogspot.com/2018/10/wcf-exception-network-access-for.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接