Partager via


ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Propriété

Définition

Obtient ou définit une valeur qui spécifie que les exceptions d’exécution non gérées générales doivent être converties en un FaultException<TDetail> type ExceptionDetail et envoyées en tant que message d’erreur. Définissez cette valeur true uniquement pendant le développement pour résoudre les problèmes d’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 des 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 ServiceBehaviorAttribute propriétés. La BehaviorService classe 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 de service pour chaque session.

  • Le service est monothread et ne prend pas en charge les appels reentrants.

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

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 transmises pour que l’exemple de code suivant s’exécute correctement. Pour prendre en charge les transactions transmises à l’aide de la WSHttpBindingpropriété, par exemple, définissez la propriété true dans le TransactionFlow code ou dans un fichier de configuration d’application. L’exemple de code suivant montre le fichier de configuration de 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

Définissez IncludeExceptionDetailInFaults pour true activer les informations d’exception à transmettre aux clients à des fins de débogage. Cette propriété nécessite une liaison qui prend en charge la réponse à la demande ou la messagerie duplex.

Dans toutes les applications gérées, les erreurs de traitement sont représentées par Exception des objets. Dans les applications SOAP telles que les applications WCF, les méthodes qui implémentent les 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 à partir d’exceptions en erreurs SOAP. Pour plus d’informations, consultez Spécification et gestion des erreurs dans les contrats et les services.

Pendant le développement, vous souhaiterez peut-être que votre service renvoie également d’autres exceptions au client pour vous aider à déboguer. Il s’agit d’une fonctionnalité de développement uniquement et ne doit pas être utilisée dans les services déployés.

Pour faciliter le débogage, définissez la valeur true dans le IncludeExceptionDetailInFaults code ou à l’aide d’un fichier de configuration d’application.

Lorsqu’il est activé, le service retourne automatiquement des informations d’exception plus sûres à l’appelant. Ces erreurs apparaissent au client en tant qu’objets FaultException<TDetail> de type ExceptionDetail.

Important

Paramètre IncludeExceptionDetailInFaults permettant aux true clients d’obtenir des informations sur les exceptions de méthode de service interne ; il est recommandé uniquement de déboguer temporairement une application de service. En outre, le WSDL pour une méthode qui retourne des exceptions managées non gérées de cette façon ne contient pas le contrat pour le FaultException<TDetail> type ExceptionDetail. Les clients doivent s’attendre à la possibilité d’une erreur SOAP inconnue pour obtenir correctement les informations de débogage.

La définition de cette propriété true peut également être effectuée à l’aide d’un fichier de configuration d’application et de l’élément <serviceDebug> , comme l’illustre l’exemple de code suivant.

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

S’applique à