为什么在machine.config中定义了TransactionScope超时?

时间:2017-05-29 11:06:20

标签: c# .net transactionscope

正如我们从this回答所知,TransactionScope的maxTimeout是在machine.config中定义的。

那么,是什么原因?为什么我们不能在app.config(web.config)或代码中覆盖它?

1 个答案:

答案 0 :(得分:4)

为什么在machine.config中定义了TransactionScope超时?

  • machine.config文件存储机器级别的配置设置。 Machine.config设置适用于服务器上驻留的所有Web应用程序。和TransactionScope超时值是任何人都希望在您的所有Web应用程序中保持一致的值。
  • 这样做的好处是,当您想更改IIS中托管的所有应用程序的事务作用域超时值时,可以通过在一个位置更改值来实现。但是,这并不意味着您不能在app.config或web.config文件中覆盖它。有一种方法可以覆盖它。

为什么我们不能在app.config(web.config)或仅在代码中覆盖它?

  • 几天前,我也在寻找可能的替代方法,并且在下面找到了两个对我有用的解决方案。这里是包含完整文章的链接。 Link

1。覆盖web.config / app.config文件:  -在machine.config文件的“ system.transactions”部分组节点下的“ machineSettings”部分节点中,有一个名为“ allowExeDefinition”的属性,默认值为“ MachineOnly”。将此值更改为“ MachineToApplication”。这样一来,就可以将以下内容添加到应用程序的web.config中,并覆盖机器范围的设置:

<system.transactions>
<machineSettings maxTimeout="00:20:00" />
</system.transactions>
  • 尽管此方法会更改计算机范围的设置,但不会更改计算机范围的maxtimeout。一个人将能够保留为maxTimeout设置的任何值,而一个人将能够为app.config中的特定应用程序设置任何合适的值。因此,每个应用程序都可以覆盖机器范围的maxTimeout设置,并设置自己的maxTimeout。

    2。覆盖代码:

  • 此方法使用反射API来访问Microsoft类的私有数据成员。如果您不熟悉反射API,则可以参考此Link
  • 它不需要修改machine.config,也不需要为可能的DOS情况打开其他应用程序,并且可以绕开任何公司政策。下面是执行此操作的代码:

    public static class TransactionManagerHelper
        {
            public static void OverrideMaximumTimeout(TimeSpan timeout)
            {
                //TransactionScope inherits a *maximum* timeout from Machine.config.  There's 
                  no way to override it from
                //code unless you use reflection.  Hence this code!
                //TransactionManager._cachedMaxTimeout
                var type = typeof(TransactionManager);
                var cachedMaxTimeout = type.GetField("_cachedMaxTimeout", 
                BindingFlags.NonPublic | BindingFlags.Static);
                cachedMaxTimeout.SetValue(null, true);
    
                //TransactionManager._maximumTimeout
                var maximumTimeout = type.GetField("_maximumTimeout", BindingFlags.NonPublic | BindingFlags.Static);
                maximumTimeout.SetValue(null, timeout);
            }
        }
    
  • 要使用它,请在创建TransactionScope对象之前调用以下命令:

    TransactionManagerHelper.OverrideMaximumTimeout(TimeSpan.FromMinutes(5));

Machine.config的路径

  • 32位系统

%windir%\ Microsoft.NET \ Framework [version] \ config \ machine.config

  • 64位系统

%windir%\ Microsoft.NET \ Framework64 [version] \ config \ machine.config