Usar System.Transactions no ASP.NET

O tópico descreve como você pode usar com êxito System.Transactions dentro de um aplicativo ASP.NET.

Habilitar DistributedTransactionPermission no ASP.NET

System.Transactions dá suporte a chamadores parcialmente confiáveis e é marcado com o atributo AllowPartiallyTrustedCallers (APTCA). Níveis de confiança para System.Transactions são definidos com base nos tipos de recursos (por exemplo, memória do sistema, recursos compartilhados de todo o processo, recursos de todo o sistema e outros recursos), que System.Transactions expõe e o nível de confiança deve ser necessária para acessar esses recursos. Em um ambiente de confiança parcial, um assembly de confiança total não pode usar somente as transações dentro do domínio de aplicativo (nesse caso, o único recurso que está sendo protegido é a memória do sistema), a menos que ele recebe o DistributedTransactionPermission.

DistributedTransactionPermission é exigido sempre que o gerenciamento de transações é escalonado para ser gerenciado pelo MSDTC (Coordenador de Transações Distribuídas da Microsoft). Esse tipo de cenário usa recursos de todo o processo e especialmente um recurso global, que é o espaço reservado no log do MSDTC. Um exemplo dessa utilização é uma Web front-end para um banco de dados ou um aplicativo que usa um banco de dados como parte dos serviços que ele fornece.

ASP.NET tem seu próprio conjunto de níveis de confiança e associa um conjunto específico de permissões a esses níveis de confiança por meio de arquivos de política. Para obter mais informações, confira Níveis de confiança e arquivos de política de ASP.NET. Quando você instala o SDK do Windows, nenhum arquivo de política padrão do ASP.NET é associado a DistributedTransactionPermission. Assim, quando sua transação em um aplicativo ASP.NET for escalonada para ser gerenciada pelo MSDTC, o escalonamento falhará com um SecurityException após exigir DistributedTransactionPermission. Para habilitar o escalonamento de transação em um ambiente de confiança parcial de ASP.NET, você deve conceder a DistributedTransactionPermission nos mesmos níveis de confiança padrão que de SqlClientPermission. Você pode configurar seu próprio arquivo de nível e a diretiva de confiança personalizadas para dar suporte a isso ou você pode modificar os arquivos de política padrão, que são Web_hightrust.config e Web_mediumtrust.config.

Para modificar os arquivos de política, adicione um elemento SecurityClass de DistributedTransactionPermission para o elemento SecurityClasses sob o elemento PolicyLevel e adicione um elemento correspondente IPermission sob o ASP.NET NamedPermissionSet para System.Transactions. O arquivo de configuração a seguir demonstra isso.

<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>

Para obter mais informações sobre a política de segurança de ASP.NET, consulte Elemento securityPolicy (esquema de configurações de ASP.NET).

Compilação dinâmica

Se você deseja importar e usar System.Transactions em um aplicativo ASP.NET que é compilado dinamicamente mediante acesso, você deve colocar uma referência para o assembly System.Transactions no arquivo de configuração. Especificamente, a referência deve ser adicionada sob a seção compilation/assemblies da raiz padrão do arquivo de configuração Web.config ou arquivo de configuração de um aplicativo Web específico. O exemplo a seguir demonstra isso.

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

Para obter mais informações, confira Elemento add para assemblies para compilação (esquema de configurações de ASP.NET).

Confira também