ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Proprietà

Definizione

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.Gets or sets a value that specifies that general unhandled execution exceptions are to be converted into a FaultException<TDetail> of type ExceptionDetail and sent as a fault message. Impostare questa proprietà su true solo durante la fase di sviluppo per la risoluzione dei problemi di un servizio.Set this to true only during development to troubleshoot a service.

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.true if unhandled exceptions are to be returned as SOAP faults; otherwise, false. Il valore predefinito è false.The default is false.

Esempi

Nell'esempio di codice seguente vengono illustrate le proprietà della classe ServiceBehaviorAttribute.The following code example demonstrates the ServiceBehaviorAttribute properties. La classe BehaviorService utilizza l'attributo ServiceBehaviorAttribute per indicare quanto segue:The BehaviorService class uses the ServiceBehaviorAttribute attribute to indicate that:

  • I metodi di implementazione sono richiamati sul thread UI.Implementation methods are invoked on the UI thread.

  • È presente un solo oggetto servizio per ogni sessione.There is one service object for each session.

  • Il servizio è a thread singolo e non supporta le chiamate rientranti.The service is single-threaded and does not support reentrant calls.

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.Furthermore, at the operation level, the OperationBehaviorAttribute values indicate that the TxWork method automatically enlists in flowed transactions or creates a new transaction to do the work, and that the transaction is committed automatically if an unhandled exception does not occur.

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.The underlying binding must support flowed transactions for the following code example to execute properly. 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.To support flowed transactions using the WSHttpBinding, for example, set the TransactionFlow property to true in code or in an application configuration file. Nell'esempio di codice seguente viene illustrato il file di configurazione per l'esempio precedente.The following code example shows the configuration file for the preceding sample.

<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.Set IncludeExceptionDetailInFaults to true to enable exception information to flow to clients for debugging purposes. Per questa proprietà è necessaria un'associazione che supporti messaggi di richiesta-risposta o duplex.This property requires a binding that supports either request-response or duplex messaging.

Tutte le applicazioni gestite prevedono che gli errori di elaborazione siano rappresentati dagli oggetti Exception.In all managed applications, processing errors are represented by Exception objects. Nelle applicazioni basate su SOAP, ad esempio le applicazioni WCF, i metodi che implementano le operazioni del servizio comunicano informazioni sugli errori mediante messaggi di errore SOAP.In SOAP-based applications such as WCF applications, methods that implement service operations communicate error information using SOAP fault messages. 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.Because WCF applications execute under both types of error systems, any managed exception information that needs to be sent to the client must be converted from exceptions into SOAP faults. Per ulteriori informazioni, vedere specifica e gestione di errori in contratti e servizi.For more information, see Specifying and Handling Faults in Contracts and Services.

Durante lo sviluppo, può essere necessario che il servizio invii anche altre accezioni al client per agevolare il debug.During development, you may want your service to also send other exceptions back to the client to assist you in debugging. Si tratta di una funzionalità destinata solo allo sviluppo e non deve essere utilizzata nei servizi distribuiti.This is a development-only feature and should not be employed in deployed services.

Per semplificare lo sviluppo del IncludeExceptionDetailInFaults debug, impostare su nel codice o utilizzando un file di true configurazione dell'applicazione.To facilitate debugging development, set the IncludeExceptionDetailInFaults to true either in code or using an application configuration file.

Quando è abilitata, il servizio restituisce automaticamente al chiamante informazioni più sicure sulle eccezioni.When enabled, the service automatically returns safer exception information to the caller. Il client considera questi errori come oggetti FaultException<TDetail> di tipo ExceptionDetail.These faults appear to the client as FaultException<TDetail> objects of type ExceptionDetail.

Importante

L' IncludeExceptionDetailInFaults impostazione true di su consente ai client di ottenere informazioni sulle eccezioni del metodo del servizio interno. è consigliabile solo come modalità temporanea di debug di un'applicazione di servizio.Setting IncludeExceptionDetailInFaults to true enables clients to obtain information about internal service method exceptions; it is only recommended as a way of temporarily debugging a service application. 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.In addition, the WSDL for a method that returns unhandled managed exceptions in this way does not contain the contract for the FaultException<TDetail> of type ExceptionDetail. Per ottenere correttamente le informazioni di debug, i client devono prevedere la possibilità di ricevere un errore SOAP sconosciuto.Clients must expect the possibility of an unknown SOAP fault to obtain the debugging information properly.

L'impostazione di questa true proprietà su può essere eseguita anche utilizzando un file di configurazione dell'applicazione e l' <elemento serviceDebug> , come illustrato nell'esempio di codice seguente.Setting this property to true can also be done using an application configuration file and the <serviceDebug> element, as the following code example shows.

<serviceBehaviors>
  <behavior name="metadataAndDebugEnabled">
    <serviceDebug
      includeExceptionDetailInFaults="true"
    />
    <serviceMetadata
      httpGetEnabled="true"
      httpGetUrl=""
    />
  </behavior>
</serviceBehaviors>

Si applica a