Partager via


ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Propriété

Définition

Obtient ou définit une valeur qui indique que les exceptions d'exécution générales non prises en charge doivent être converties en FaultException<TDetail> de type ExceptionDetail et envoyées en tant que message d'erreur. Affectez la valeur true uniquement lors du développement afin de dépanner un 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

Valeur de propriété

true si les exceptions non gérées doivent être retournées en tant qu'erreurs SOAP ; sinon, false. La valeur par défaut est false.

Exemples

L'exemple de code suivant illustre les propriétés ServiceBehaviorAttribute. La classe BehaviorService utilise l'attribut ServiceBehaviorAttribute pour indiquer que :

  • Les méthodes d'implémentation sont appelées sur le thread d'interface utilisateur.

  • Il existe un objet du service pour chaque session.

  • Le service est monothread et ne prend pas en charge les appels réentrants.

En outre, au niveau de l’opération, les valeurs OperationBehaviorAttribute indiquent que la méthode TxWork s’inscrit automatiquement dans les transactions passées ou crée une transaction pour faire le travail, et que la transaction est validée automatiquement si aucune exception non gérée ne se produit.

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

La liaison sous-jacente doit prendre en charge les transactions passées pour l'exemple de code suivant pour s'exécuter correctement. Pour prendre en charge les transactions passées à l'aide de WSHttpBinding, par exemple, affectez la valeur TransactionFlow à la propriété true dans le code ou dans un fichier de configuration de l'application. L'exemple de code suivant montre le fichier de configuration pour l'exemple précédent :

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

Remarques

Affectez la valeur IncludeExceptionDetailInFaults à true pour permettre aux informations sur les exceptions d'être transmises aux clients à des fins de débogage. Cette propriété requiert une liaison qui prend en charge la messagerie en mode demande-réponse ou duplex.

Dans toutes les applications managées, les erreurs de traitement sont représentées par des objets Exception. Dans les applications SOAP telles que les applications WCF, les méthodes qui implémentent des opérations de service communiquent des informations d’erreur à l’aide de messages d’erreur SOAP. Étant donné que les applications WCF s’exécutent sous les deux types de systèmes d’erreur, toutes les informations d’exception managées qui doivent être envoyées au client doivent être converties des exceptions en erreurs SOAP. Pour plus d’informations, consultez Spécification et gestion des erreurs dans les contrats et les services.

Durant le développement, vous pouvez souhaiter que votre service renvoie également d'autres exceptions au client afin de vous aider lors du débogage. Cette fonctionnalité est réservée au développement et ne doit être pas employée dans le cadre de services déployés.

Pour faciliter le débogage du développement, définissez sur dans le code ou à l’aide IncludeExceptionDetailInFaultstrue d’un fichier de configuration d’application.

En cas d'activation, le service retourne automatiquement des informations plus sûres sur les exceptions à l'appelant. Ces erreurs apparaissent au client sous la forme d'objets FaultException<TDetail> de type ExceptionDetail.

Important

La définition IncludeExceptionDetailInFaults de sur true permet aux clients d’obtenir des informations sur les exceptions de méthode de service interne ; il est recommandé uniquement comme moyen de déboguer temporairement une application de service. De plus, le WSDL pour une méthode qui retourne des exceptions managées non prises en charge de cette façon ne contient pas le contrat pour le FaultException<TDetail> de type ExceptionDetail. Les clients doivent attendre une erreur SOAP inconnue pour obtenir correctement les informations de débogage.

Vous pouvez également définir cette propriété sur true à l’aide d’un fichier de configuration d’application et de l’élément <serviceDebug> , comme le montre l’exemple de code suivant.

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

S’applique à