Использование инфраструктуры System.Transactions в среде ASP.NET

В этом разделе описывается, как можно успешно использовать инфраструктуру System.Transactions в приложении ASP.NET.

Включение разрешения DistributedTransactionPermission в ASP.NET

System.Transactions поддерживает частично доверенные вызывающие элементы и помечается атрибутом AllowPartiallyTrustedCallers (APTCA). Уровни System.Transactions доверия определяются на основе типов ресурсов (например, системной памяти, общих ресурсов на уровне процессов, системных ресурсов и других ресурсов), System.Transactions которые предоставляют и уровень доверия, необходимый для доступа к этим ресурсам. В среде с частичным доверием сборка с неполным доверием может использовать только транзакции внутри домена приложения (в этом случае единственным защищаемым ресурсом является системная память), пока этой сборке не будет предоставлено разрешение DistributedTransactionPermission.

РазрешениеDistributedTransactionPermission запрашивается при каждой передаче управления транзакцией координатору распределенных транзакций (Майкрософт) (MSDTC). В этом сценарии используются ресурсы, общие для всего процесса, и прежде всего один глобальный ресурс, зарезервированный в журнале MSDTC, например внешнее веб-приложение для взаимодействия с базой данных или приложение, использующее базу данных в рамках предоставляемых им служб.

У среды ASP.NET имеется собственный набор уровней доверия, с которыми с помощью файлов политики связан определенный набор разрешений. Дополнительные сведения см. в ASP.NET уровнях доверия и файлах политик. При первоначальной установке пакета SDK для Windows ни один из ASP.NET файлов политики по умолчанию не связан с DistributedTransactionPermission. Поэтому передачу управления транзакцией приложения ASP.NET координатору MSDTC выполнить не удается — возникает исключение SecurityException при запросе разрешения DistributedTransactionPermission. Чтобы обеспечить передачу транзакции на следующий уровень иерархии среды ASP.NET с частичным доверием, необходимо предоставить разрешение DistributedTransactionPermission для уровней доверия по умолчанию, у которых есть разрешение SqlClientPermission. Можно настроить пользовательский уровень доверия и файл политики для его поддержки или изменить файлы политики по умолчанию Web_hightrust.config и Web_mediumtrust.config.

Чтобы изменить файлы политики, добавьте элемент в DistributedTransactionPermissionSecurityClasses элемент под PolicyLevel элементом и добавьте SecurityClass соответствующий IPermission элемент в ASP.NET NamedPermissionSet для System.Transactions. Это показано в следующем файле конфигурации.

<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 Element (ASP.NET Параметры Schema).

Динамическая компиляция

Чтобы импортировать и использовать System.Transactions в приложении ASP.NET, динамически компилируемом во время доступа, в файле конфигурации необходимо указать ссылку на сборку System.Transactions. В частности, ссылка должна быть добавлена в compilation/assemblies разделе корневого файла конфигурации web.config по умолчанию или файла конфигурации конкретного веб-приложения. Это продемонстрировано в следующем примере.

<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 Параметры схема).>

См. также