ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene o imposta un valore che specifica che le eccezioni di esecuzione generiche non gestite devono essere convertite in una classe FaultException<TDetail> di tipo ExceptionDetail e inviate come messaggio di errore. Impostare questa proprietà su true
solo durante la fase di sviluppo per la risoluzione dei problemi di un servizio.
public:
property bool IncludeExceptionDetailInFaults { bool get(); void set(bool value); };
public bool IncludeExceptionDetailInFaults { get; set; }
member this.IncludeExceptionDetailInFaults : bool with get, set
Public Property IncludeExceptionDetailInFaults As Boolean
Valore della proprietà
true
se le eccezioni non gestite devono essere restituite come errori SOAP; in caso contrario, false
. Il valore predefinito è false
.
Esempio
Nell'esempio di codice seguente vengono illustrate le proprietà della classe ServiceBehaviorAttribute. La classe BehaviorService
utilizza l'attributo ServiceBehaviorAttribute per indicare quanto segue:
I metodi di implementazione sono richiamati sul thread UI.
È presente un solo oggetto servizio per ogni sessione.
Il servizio è a thread singolo e non supporta le chiamate rientranti.
Inoltre, a livello di operazione, i valori della classe OperationBehaviorAttribute indicano che il metodo TxWork
viene inserito automaticamente nelle transazioni propagate o crea una nuova transazione per l'esecuzione dell'operazione e che, se non si verifica alcuna eccezione non gestita, viene eseguito automaticamente il commit della transazione.
using System;
using System.ServiceModel;
using System.Transactions;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
SessionMode=SessionMode.Required
)]
public interface IBehaviorService
{
[OperationContract]
string TxWork(string message);
}
// Note: To use the TransactionIsolationLevel property, you
// must add a reference to the System.Transactions.dll assembly.
/* The following service implementation:
* -- Processes messages on one thread at a time
* -- Creates one service object per session
* -- Releases the service object when the transaction commits
*/
[ServiceBehavior(
ConcurrencyMode=ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerSession,
ReleaseServiceInstanceOnTransactionComplete=true
)]
public class BehaviorService : IBehaviorService, IDisposable
{
Guid myID;
public BehaviorService()
{
myID = Guid.NewGuid();
Console.WriteLine(
"Object "
+ myID.ToString()
+ " created.");
}
/*
* The following operation-level behaviors are specified:
* -- The executing transaction is committed when
* the operation completes without an
* unhandled exception
* -- Always executes under a flowed transaction.
*/
[OperationBehavior(
TransactionAutoComplete = true,
TransactionScopeRequired = true
)]
[TransactionFlow(TransactionFlowOption.Mandatory)]
public string TxWork(string message)
{
// Do some transactable work.
Console.WriteLine("TxWork called with: " + message);
// Display transaction information.
TransactionInformation info = Transaction.Current.TransactionInformation;
Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier);
Console.WriteLine("The tx status: {0}.", info.Status);
return String.Format("Hello. This was object {0}.",myID.ToString()) ;
}
public void Dispose()
{
Console.WriteLine(
"Service "
+ myID.ToString()
+ " is being recycled."
);
}
}
}
Imports System.ServiceModel
Imports System.Transactions
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", SessionMode:=SessionMode.Required)> _
Public Interface IBehaviorService
<OperationContract> _
Function TxWork(ByVal message As String) As String
End Interface
' Note: To use the TransactionIsolationLevel property, you
' must add a reference to the System.Transactions.dll assembly.
' The following service implementation:
' * -- Processes messages on one thread at a time
' * -- Creates one service object per session
' * -- Releases the service object when the transaction commits
'
<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Single, InstanceContextMode:=InstanceContextMode.PerSession, _
ReleaseServiceInstanceOnTransactionComplete:=True)> _
Public Class BehaviorService
Implements IBehaviorService, IDisposable
Private myID As Guid
Public Sub New()
myID = Guid.NewGuid()
Console.WriteLine("Object " & myID.ToString() & " created.")
End Sub
'
' * The following operation-level behaviors are specified:
' * -- The executing transaction is committed when
' * the operation completes without an
' * unhandled exception
' * -- Always executes under a flowed transaction.
'
<OperationBehavior(TransactionAutoComplete:=True, TransactionScopeRequired:=True), TransactionFlow(TransactionFlowOption.Mandatory)> _
Public Function TxWork(ByVal message As String) As String Implements IBehaviorService.TxWork
' Do some transactable work.
Console.WriteLine("TxWork called with: " & message)
' Display transaction information.
Dim info As TransactionInformation = Transaction.Current.TransactionInformation
Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier)
Console.WriteLine("The tx status: {0}.", info.Status)
Return String.Format("Hello. This was object {0}.", myID.ToString())
End Function
Public Sub Dispose() Implements IDisposable.Dispose
Console.WriteLine("Service " & myID.ToString() & " is being recycled.")
End Sub
End Class
End Namespace
Affinché l'esempio di codice seguente venga eseguito correttamente, è necessario che l'associazione sottostante supporti le transazioni propagate. Per supportare le transazioni propagate utilizzando l'associazione WSHttpBinding, ad esempio, impostare la proprietà TransactionFlow su true
nel codice o in un file di configurazione dell'applicazione. Nell'esempio di codice seguente viene illustrato il file di configurazione per l'esempio precedente.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.BehaviorService"
behaviorConfiguration="metadataAndDebugEnabled"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<!--
Note:
This example code uses the WSHttpBinding to support transactions using the
WS-AtomicTransactions (WS-AT) protocol. WSHttpBinding is configured to use the
protocol, but the protocol is not enabled on some computers. Use the xws_reg -wsat+
command to enable the WS-AtomicTransactions protocol in the MSDTC service.
-->
<endpoint
contract="Microsoft.WCF.Documentation.IBehaviorService"
binding="wsHttpBinding"
bindingConfiguration="wsHttpBindingWithTXFlow"
address="http://localhost:8080/BehaviorService"
/>
<endpoint
contract="Microsoft.WCF.Documentation.IBehaviorService"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingWithTXFlow"
address="net.tcp://localhost:8081/BehaviorService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug
includeExceptionDetailInFaults="true"
/>
<serviceMetadata
httpGetEnabled="true"
httpGetUrl=""
/>
</behavior>
</serviceBehaviors>
</behaviors>
<!-- binding configuration - configures a WSHttpBinding to require transaction flow -->
<bindings>
<wsHttpBinding>
<binding name="wsHttpBindingWithTXFlow" transactionFlow="true" />
</wsHttpBinding>
<netTcpBinding>
<binding name="netTcpBindingWithTXFlow" transactionFlow="true" />
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
Commenti
Impostare IncludeExceptionDetailInFaults su true
per abilitare il flusso delle informazioni sulle eccezioni ai client per fini debug. Per questa proprietà è necessaria un'associazione che supporti messaggi di richiesta-risposta o duplex.
Tutte le applicazioni gestite prevedono che gli errori di elaborazione siano rappresentati dagli oggetti Exception. Nelle applicazioni basate su SOAP, ad esempio applicazioni WCF, i metodi che implementano le operazioni del servizio comunicano le informazioni sugli errori tramite messaggi di errore SOAP. Poiché le applicazioni WCF vengono eseguite in entrambi i tipi di sistemi di errore, tutte le informazioni sulle eccezioni gestite che devono essere inviate al client devono essere convertite da eccezioni in errori SOAP. Per altre informazioni, vedere Specifica e gestione degli errori in Contratti e servizi.
Durante lo sviluppo, può essere necessario che il servizio invii anche altre accezioni al client per agevolare il debug. Si tratta di una funzionalità destinata solo allo sviluppo e non deve essere utilizzata nei servizi distribuiti.
Per facilitare lo sviluppo del debug, impostare su IncludeExceptionDetailInFaultstrue
su nel codice o usando un file di configurazione dell'applicazione.
Quando è abilitata, il servizio restituisce automaticamente al chiamante informazioni più sicure sulle eccezioni. Il client considera questi errori come oggetti FaultException<TDetail> di tipo ExceptionDetail.
Importante
L'impostazione IncludeExceptionDetailInFaults di su true
consente ai client di ottenere informazioni sulle eccezioni del metodo del servizio interno. È consigliabile solo per eseguire temporaneamente il debug di un'applicazione di servizio. Inoltre, il codice WSDL di un metodo che restituisce in questo modo eccezioni gestite senza tuttavia gestirle non contiene il contratto dell'eccezione FaultException<TDetail> di tipo ExceptionDetail. Per ottenere correttamente le informazioni di debug, i client devono prevedere la possibilità di ricevere un errore SOAP sconosciuto.
L'impostazione di questa proprietà su true
può essere eseguita anche usando un file di configurazione dell'applicazione e l'elemento <serviceDebug> , come illustrato nell'esempio di codice seguente.
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug
includeExceptionDetailInFaults="true"
/>
<serviceMetadata
httpGetEnabled="true"
httpGetUrl=""
/>
</behavior>
</serviceBehaviors>