Condividi tramite


Utilizzo della gestione degli errori

Durante la gestione degli errori di Windows Communication Foundation (WCF) non viene restituito un messaggio di eccezione al client, a meno che non venga generata un'eccezione (o un sottotipo) o venga implementato un erroreContract . In questi scenari è pertanto possibile tenere traccia solo dei dati del messaggio di errore. Un'eccezione nelle implementazioni di callback torna automaticamente come messaggio di errore per i punti di traccia ServerFault e ClientFault . Tuttavia, verrà sempre restituito un errore generico con un messaggio generico. Per altre informazioni sui contratti di errore WCF, vedere https://go.microsoft.com/fwlink/?LinkId=83132.

È inoltre possibile tenere traccia delle costanti e delle proprietà del contesto attraverso i track point degli errori.

Se i dettagli dell'eccezione vengono restituiti negli errori usando l'attributo IncludeExceptionDetailInFaults , estrarre il messaggio di eccezione effettivo tramite XPath.

La gestione degli errori viene fornita dai punti di traccia di errore definiti in GetServiceContractCallPoint:

  • ServiceFault

  • ClientFault

  • CallbackFault

    Quando si utilizzano questi track point degli errori, i dati relativi agli errori vengono sempre mantenuti, anche se si opera in uno scenario basato sulle transazioni. L'integrità transazionale viene garantita per tutti i dati rilevati non di errore, dei quali viene inoltre eseguito il rollback come risposta all'errore.

Nota

Questi punti di traccia vengono applicati al percorso di risposta e si applicano solo ai punti di chiamata del contratto di servizio ServiceReply, ClientReply e CallbackReply forniti da GetServiceContractCallPoint.

Esempio di configurazione degli errori

Nell'esempio seguente viene illustrato il rilevamento del messaggio di eccezione in un ServiceFault quando il servizio genera un erroreException nell'evento AuthorizationServiceFault ; in caso contrario, tiene traccia dell'espressione booleana restituita dall'operazione nell'evento AuthorizationServiceReply . AuthorizationServiceReply OnEvent o AuthorizationServiceFault OnEvent viene persistente.

Nota

L'implementazione di questo esempio dimostra che i track point ServiceReply e ServiceFault si escludono a vicenda.

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

Vedere anche

Configurazione dell'adapter WCF per l'intercettazione dei dati BAM