在 ASP.NET 中使用 System.Transactions

本主题介绍如何在 ASP.NET 应用程序中成功使用 System.Transactions

在 ASP.NET 中启用 DistributedTransactionPermission

System.Transactions 支持部分信任的调用方,可以用 AllowPartiallyTrustedCallers 特性 (APTCA) 对其进行标记。 System.Transactions 的信任级别是根据System.Transactions 公开的资源类型(例如,系统内存、共享进程范围资源、系统范围资源和其他资源)以及访问这些资源所需的信任级别来定义的。 在部分信任环境中,非完全信任程序集只能使用应用程序域中的事务(在这种情况下,唯一受保护的资源是系统内存),除非授予它 DistributedTransactionPermission

每当将事务管理升级为由 Microsoft 分布式事务协调器 (MSDTC) 进行管理时,都会要求DistributedTransactionPermission 。 这种方案使用的是进程范围的资源尤其是全局资源,全局资源是指 MSDTC 日志中的保留空间。 此用法的一个示例是数据库或应用程序 Web 前端,该应用程序使用数据库作为它提供的服务的一部分。

ASP.NET 有自己的信任级别集,并通过策略文件将这些特定权限集与这些信任级别相关联。 有关详细信息,请参阅 ASP.NET 信任级别和策略文件。 最初安装 Windows SDK 时,没有任何默认的 ASP.NET 策略文件与 DistributedTransactionPermission 相关联。 因此,当 ASP.NET 应用程序中的事务升级为由 MSDTC 管理时,升级就会失败,并引发有关要求 SecurityExceptionDistributedTransactionPermission 异常。 若要在 ASP.NET 部分信任环境中启用事务升级,应授予 DistributedTransactionPermissionSqlClientPermission 的默认信任级别相同。 可以配置自己的自定义信任级别和策略文件以支持此功能,也可以修改默认策略文件, Web_hightrust.configWeb_mediumtrust.config

若要修改策略文件,请将SecurityClassDistributedTransactionPermission元素添加到SecurityClassesPolicyLevel元素下,并在 ASP.NET 的IPermission下为 System.Transactions 添加相应的NamedPermissionSet元素。 以下配置文件演示了这一点。

<SecurityClasses>
   <SecurityClass Name="DistributedTransactionPermission" Description="System.Transactions.DistributedTransactionPermission, System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
...
</SecurityClasses>

<PermissionSet
  class="NamedPermissionSet"
  version="1"
  Name="ASP.Net">
     <IPermission
        class="System.Transactions.DistributedTransactionPermission, System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
        version="1"
        Unrestricted="true"
     />
...
</PermissionSet>

有关 ASP.NET 安全策略的详细信息,请参阅 securityPolicy 元素(ASP.NET 设置架构)。

动态编译

如果要在访问时动态编译的 ASP.NET 应用程序中导入和使用 System.Transactions ,则应在配置文件中放置对程序集的引用 System.Transactions 。 具体而言,应在默认根 compilation/assemblies 配置文件或特定 Web 应用程序的配置文件部分下添加引用。 下面的示例演示这一操作。

<configuration>
   <system.web>
      <compilation>
         <assemblies>
      <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
         </assemblies>
      </compilation>
   </system.web>
</configuration>

有关详细信息,请参阅添加用于编译的程序集的元素(ASP.NET 设置架构)。

另请参阅