正如我们从this回答所知,TransactionScope的maxTimeout是在machine.config中定义的。
那么,是什么原因?为什么我们不能在app.config(web.config)或代码中覆盖它?答案 0 :(得分:4)
为什么在machine.config中定义了TransactionScope超时?
为什么我们不能在app.config(web.config)或仅在代码中覆盖它?
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。覆盖代码:
它不需要修改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的路径
%windir%\ Microsoft.NET \ Framework [version] \ config \ machine.config
%windir%\ Microsoft.NET \ Framework64 [version] \ config \ machine.config