【问题标题】:Network access for Distributed Transaction Manager (MSDTC) has been disabled分布式事务管理器 (MSDTC) 的网络访问已被禁用
【发布时间】:2011-03-01 01:32:50
【问题描述】:

错误:

分布式事务管理器 (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             }  

【问题讨论】:

  • 如果是本地事务,为什么要使用 DTC?
  • 哇 6 年前!,除此之外,如果您使用异步,您需要添加“TransactionScopeAsyncFlowOption.Enabled”,如使用 (var trans = new TransactionScope((TransactionScopeAsyncFlowOption.Enabled)))

标签: asp.net system.transactions


【解决方案1】:

要在 Windows Vista/7/8 Server 2008R2/2012 上启用对 MSDTC 的网络访问,请按照以下步骤操作:

  1. 点击开始,点击运行,输入dcomcnfg,然后点击确定打开组件服务

  2. 在控制台树中,点击展开组件服务,点击展开计算机,点击展开我的电脑,点击展开Distributed Transaction Coordinator,然后点击Local DTC

  3. 右键单击Local DTC,然后单击Properties,显示Local DTC Properties对话框。

  4. 点击安全标签。

  5. 勾选“Network DTC Access”复选框。

  6. 最后勾选“允许入站”“允许出站”复选框。

  7. 点击应用确定

  8. 将弹出一条关于重新启动服务的消息。

  9. 点击确定就可以了。

【讨论】:

  • 这有什么安全风险?我宁愿不要在没有完全理解其含义的情况下盲目开放网络访问。
【解决方案2】:

在事务作用域 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)   
    {   
    }                       
}    

【讨论】:

    【解决方案3】:

    如果有人正在查看并使用 linq,则只需将整个事务包装到 JoinScope 中,如下所示:

    using js = new JoinScope(false) {
        using (System.Transactions.TransactionScope ts = new Sytem.Transactions.TransactionScope()) { 
            ... 
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        启用网络 DTC 访问:

        1. 在 start 中运行 dcomcnfg 以打开组件服务管理工具

        2. 点击本地 DTC 并打开属性窗口

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多