Compartir a través de


Utilizar el control de errores

Durante el control de errores de Windows Communication Foundation (WCF), no se devuelve un mensaje de excepción al cliente a menos que se inicie una excepción FaultException (o un subtipo) o se implemente un faultContract . Por este motivo, sólo se puede realizar el seguimiento de datos desde el propio mensaje de error en estos escenarios. Una excepción en las implementaciones de devolución de llamada vuelve automáticamente como un mensaje de error para los puntos de seguimiento ServerFault y ClientFault . Sin embargo, siempre devuelve un error genérico con un mensaje genérico. Para obtener más información sobre los contratos de error de WCF, vea https://go.microsoft.com/fwlink/?LinkId=83132.

También puede realizar el seguimiento de constantes y de propiedades de contexto a través de puntos de seguimiento de error.

Si los detalles de la excepción se devuelven en errores mediante el atributo IncludeExceptionDetailInFaults , se extrae el mensaje de excepción real a través de XPath.

El control de errores lo proporcionan los puntos de seguimiento de errores definidos en GetServiceContractCallPoint:

  • ServiceFault

  • ClientFault

  • CallbackFault

    Cuando se utilizan estos puntos de seguimiento de errores, los datos de error se guardan siempre, incluso cuando se trabaja en un escenario basado en transacciones. La integridad transaccional se mantiene en todos los datos de seguimiento sin error y los datos de seguimiento sin error se revierten como respuesta al error.

Nota

Estos puntos de seguimiento se aplican a la ruta de acceso de respuesta y solo se aplican a los puntos de llamada de contrato de servicio ServiceReply, ClientReply y CallbackReply proporcionados por GetServiceContractCallPoint.

Ejemplo de configuración de error

En el ejemplo siguiente se muestra cómo realizar el seguimiento del mensaje de excepción en un ServiceFault cuando el servicio inicia una excepción FaultException en el evento AuthorizationServiceFault ; de lo contrario, realiza un seguimiento de la expresión booleana devuelta por la operación en el evento AuthorizationServiceReply . AuthorizationServiceReply OnEvent o AuthorizationServiceFault OnEvent se conservan.

Nota

La implementación de este ejemplo demuestra la exclusividad mutua de los puntos de seguimiento ServiceReply y ServiceFault.

<ic:OnEvent IsBegin ="true" IsEnd="false" Name="AuthorizationServiceReply" Source="ESCreditCardService">

  <ic:Filter>
    <ic:Expression>
      <wcf:Operation Name="GetServiceContractCallPoint"/>
      <ic:Operation Name ="Constant">
        <ic:Argument>ServiceReply</ic:Argument>
      </ic:Operation>
      <ic:Operation Name ="Equals"/>
      <wcf:Operation Name="GetOperationName" />
      <ic:Operation Name="Constant">
        <ic:Argument>AuthorizeWithDataContract</ic:Argument>
      </ic:Operation>
      <ic:Operation Name ="Equals" />
      <ic:Operation Name ="And" />
    </ic:Expression>
  </ic:Filter>

  <ic:CorrelationID>
    <ic:Expression>
      <wcf:Operation Name="AutoGenerateCorrelationToken"/>
    </ic:Expression>
  </ic:CorrelationID>

  <ic:Update DataItemName="Status" Type="NVARCHAR">
    <ic:Expression>
      <ic:Operation Name="Constant">
        <ic:Argument>Success</ic:Argument>
      </ic:Operation>
    </ic:Expression>
  </ic:Update>

  <ic:Update DataItemName="Result" Type="NVARCHAR">
    <ic:Expression>
      <wcf:Operation Name ="XPath">
        <wcf:Argument>//s:Body/ccservice:*/ccservice:AuthorizeWithDataContractResult</wcf:Argument>
      </wcf:Operation>
    </ic:Expression>
  </ic:Update>

  <ic:Update DataItemName ="Service Call Date" Type ="DATETIME">
    <ic:Expression>
      <wcf:Operation Name ="GetContextProperty">
        <wcf:Argument>EventTime</wcf:Argument>
      </wcf:Operation>
    </ic:Expression>
  </ic:Update>

</ic:OnEvent>

<ic:OnEvent IsBegin ="true" IsEnd="false" Name="AuthorizationServiceFault" Source="ESCreditCardService">

  <ic:Filter>
    <ic:Expression>
      <wcf:Operation Name="GetServiceContractCallPoint"/>
      <ic:Operation Name ="Constant">
        <ic:Argument>ServiceFault</ic:Argument>
      </ic:Operation>
      <ic:Operation Name ="Equals"/>
      <wcf:Operation Name="GetOperationName" />
      <ic:Operation Name="Constant">
        <ic:Argument>AuthorizeWithDataContract</ic:Argument>
      </ic:Operation>
      <ic:Operation Name ="Equals" />
      <ic:Operation Name ="And" />
    </ic:Expression>
  </ic:Filter>

  <ic:CorrelationID>
    <ic:Expression>
      <wcf:Operation Name="AutoGenerateCorrelationToken"/>
    </ic:Expression>
  </ic:CorrelationID>

  <ic:Update DataItemName="Status" Type="NVARCHAR">
    <ic:Expression>
      <ic:Operation Name="Constant">
        <ic:Argument>Fault</ic:Argument>
      </ic:Operation>
    </ic:Expression>
  </ic:Update>

      <ic:Update DataItemName="Source" Type="NVARCHAR">
        <ic:Expression>
          <wcf:Operation Name ="XPath">
            <wcf:Argument>//s:Body/Fault/Reason/Text</wcf:Argument>
          </wcf:Operation>
        </ic:Expression>
      </ic:Update>

  <ic:Update DataItemName ="Service Call Date" Type ="DATETIME">
    <ic:Expression>
      <wcf:Operation Name ="GetContextProperty">
        <wcf:Argument>EventTime</wcf:Argument>
      </wcf:Operation>
    </ic:Expression>
  </ic:Update>

</ic:OnEvent>

Consulte también

Configuración del adaptador de WCF para interceptar datos de BAM