ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Propiedad

Definición

Obtiene o establece un valor que especifica que las excepciones de ejecución generales no controladas se convertirán en una FaultException<TDetail> de tipo ExceptionDetail, y se enviarán como mensaje de error.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. Establezca este valor como true sólo durante el desarrollo para solucionar problemas de un servicio.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

Valor de propiedad

true si las excepciones no controladas se devuelven como errores de SOAP; de lo contrario, false.true if unhandled exceptions are to be returned as SOAP faults; otherwise, false. De manera predeterminada, es false.The default is false.

Ejemplos

En el ejemplo de código siguiente se muestran las propiedades ServiceBehaviorAttribute.The following code example demonstrates the ServiceBehaviorAttribute properties. La clase BehaviorService utiliza el atributo ServiceBehaviorAttribute para indicar que:The BehaviorService class uses the ServiceBehaviorAttribute attribute to indicate that:

  • Los métodos de implementación se invocan en el subproceso de la interfaz de usuario.Implementation methods are invoked on the UI thread.

  • Hay un objeto de servicio para cada sesión.There is one service object for each session.

  • La instancia del servicio es de subproceso único y no admite llamadas reentrantes.The service is single-threaded and does not support reentrant calls.

Además, en el nivel de la operación, los valores OperationBehaviorAttribute indican que el método TxWork da de alta automáticamente las transacciones de flujo o crea una transacción nueva para hacer el trabajo y que se confirma la transacción automáticamente si no se produce una excepción no controlada.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

El enlace subyacente debe admitir transacciones de flujo para que el ejemplo de código siguiente se ejecute correctamente.The underlying binding must support flowed transactions for the following code example to execute properly. Para admitir transacciones de flujo con WSHttpBinding, por ejemplo, establezca la propiedad TransactionFlow como true en el código o en un archivo de configuración de la aplicación.To support flowed transactions using the WSHttpBinding, for example, set the TransactionFlow property to true in code or in an application configuration file. El ejemplo de código siguiente muestra el archivo de configuración para el ejemplo anterior: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>

Comentarios

Establezca IncludeExceptionDetailInFaults como true para permitir que la información de excepción fluya a los clientes para fines de depuración.Set IncludeExceptionDetailInFaults to true to enable exception information to flow to clients for debugging purposes. Esta propiedad requiere un enlace que admita tanto mensajería de solicitud-respuesta como dúplex.This property requires a binding that supports either request-response or duplex messaging.

En todas las aplicaciones administradas, los errores de procesamiento están representados mediante objetos Exception.In all managed applications, processing errors are represented by Exception objects. En aplicaciones basadas en SOAP, como las aplicaciones WCF, los métodos que implementan operaciones de servicio comunican la información de errores mediante mensajes de error de SOAP.In SOAP-based applications such as WCF applications, methods that implement service operations communicate error information using SOAP fault messages. Dado que las aplicaciones WCF se ejecutan en ambos tipos de sistemas de error, cualquier información de excepción administrada que se deba enviar al cliente debe convertirse de excepciones a errores de 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. Para obtener más información, vea especificar y controlar errores en contratos y servicios.For more information, see Specifying and Handling Faults in Contracts and Services.

Durante el desarrollo puede desear que su servicio devuelva también otras excepciones al cliente para ayudarle a depurar.During development, you may want your service to also send other exceptions back to the client to assist you in debugging. Esto es una característica sólo del desarrollo y no debería emplearse en servicios implementados.This is a development-only feature and should not be employed in deployed services.

Para facilitar el desarrollo de la depuración true , establezca en en el IncludeExceptionDetailInFaults código o en un archivo de configuración de la aplicación.To facilitate debugging development, set the IncludeExceptionDetailInFaults to true either in code or using an application configuration file.

Cuando se habilita, el servicio devuelve automáticamente información de excepción más segura al autor de la llamada.When enabled, the service automatically returns safer exception information to the caller. Estos errores aparecen en el cliente como objetos FaultException<TDetail> del tipo ExceptionDetail.These faults appear to the client as FaultException<TDetail> objects of type ExceptionDetail.

Importante

Establecer IncludeExceptionDetailInFaults entrue permite a los clientes obtener información sobre las excepciones de método de servicio interno; solo se recomienda como una manera de depurar temporalmente una aplicación de servicio.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. Además, el WSDL de un método que devuelve excepciones administradas no controladas de esta manera no contiene el contrato para la FaultException<TDetail> de 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. Los clientes deben esperar la posibilidad de que se produzca un error de SOAP desconocido para obtener correctamente la información de depuración.Clients must expect the possibility of an unknown SOAP fault to obtain the debugging information properly.

El establecimiento de esta true propiedad en también puede realizarse mediante un archivo de configuración de la aplicación y el <elemento serviceDebug> , como se muestra en el ejemplo de código siguiente.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>

Se aplica a