Uso di System.Transactions in ASP.NET
Questo argomento descrive il modo in cui è possibile utilizzare correttamente lo spazio dei nomi System.Transactions all'interno di un'applicazione ASP.NET.
Abilitare DistributedTransactionPermission in ASP.NET
System.Transactions supporta i chiamanti parzialmente attendibili ed è contrassegnato con l'attributo AllowPartiallyTrustedCallers
(APTCA). I livelli di attendibilità per System.Transactions sono definiti in base ai tipi di risorse (come memoria di sistema, risorse a livello di processo condivise, risorse a livello di sistema e altre risorse) esposti da System.Transactions e in base al livello di attendibilità necessario per accedere a queste risorse. In un ambiente parzialmente attendibile un assembly con attendibilità non totale può usare solo le transazioni all'interno del dominio applicazione (in questo caso l'unica risorsa protetta è la memoria di sistema), a meno che non ottenga l'autorizzazione DistributedTransactionPermission.
L'autorizzazioneDistributedTransactionPermission viene richiesta ogni volta che viene eseguita l'escalation della gestione della transazione in modo che questa venga gestita da Microsoft Distributed Transaction Coordinator (MSDTC). Questo tipo di scenario utilizza risorse a livello di processo e in particolare una risorsa globale, ovvero lo spazio riservato nel log di MSDTC. Un esempio di questo utilizzo è un front-end Web per un database o per un'applicazione che usa un database come parte dei servizi forniti.
ASP.NET dispone di un proprio set di livelli di attendibilità, a cui associa un set specifico di autorizzazioni utilizzando i file dei criteri. Per altre informazioni, vedere Livelli di attendibilità e file dei criteri ASP.NET. Quando si installa inizialmente Windows SDK, nessuno dei file dei criteri predefiniti di ASP.NET è associato a DistributedTransactionPermission. Ne consegue che quando si tenta di eseguire l'escalation di una transazione appartenente a un'applicazione ASP.NET in modo che venga gestita tramite MSDTC, tale tentativo ha esito negativo e viene generata un'eccezione SecurityException in quanto la transazione non dispone dell'autorizzazione DistributedTransactionPermission. Per abilitare l'escalation delle transazioni in un ambiente ASP.NET parzialmente attendibile, è necessario concedere l'autorizzazione DistributedTransactionPermission agli stessi livelli di attendibilità predefiniti indicati nell'autorizzazione SqlClientPermission. A questo scopo, è possibile configurare un livello di attendibilità e un file dei criteri personalizzati oppure modificare i file dei criteri predefiniti, ovvero Web_hightrust.config e Web_mediumtrust.config.
Per modificare i file dei criteri, aggiungere un elemento SecurityClass
per DistributedTransactionPermission
all'elemento SecurityClasses
all'interno dell'elemento PolicyLevel
. Quindi, aggiungere un elemento IPermission
corrispondente all'interno di NamedPermissionSet
di ASP.NET per System.Transactions. Queste modifiche vengono mostrate nel file di configurazione seguente.
<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>
Per altre informazioni sui criteri di sicurezza di ASP.NET, vedere Elemento securityPolicy (schema delle impostazioni ASP.NET).
Compilazione dinamica
Se si desidera importare e utilizzare lo spazio dei nomi System.Transactions in un'applicazione ASP.NET compilata dinamicamente all'accesso, è necessario inserire nel file di configurazione un riferimento all'assembly System.Transactions. In particolare, il riferimento deve essere aggiunto nella sezione compilation/assemblies
del file di configurazione Web.config radice predefinito oppure nel file di configurazione di un'applicazione Web specifica. L'esempio seguente illustra questa operazione.
<configuration>
<system.web>
<compilation>
<assemblies>
<add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
</configuration>
Per altre informazioni, vedere Elemento add per assembly per la compilazione (scheda delle impostazioni ASP.NET).