Best Practices: VermittlerBest Practices: Intermediaries

Beim Aufrufen von Vermittlern müssen Fehler ordnungsgemäß behandelt werden, um sicherzustellen, dass dienstseitige Kanäle im Vermittler ordnungsgemäß geschlossen werden.Care must be taken to handle faults correctly when calling intermediaries to make sure service side channels on the intermediary are closed properly.

Betrachten Sie folgendes Szenario.Consider the following scenario. Ein Client ruft einen Vermittler auf, der dann einen Back-End-Dienst aufruft.A client makes a call to an intermediary which then calls a back-end service. Der Back-End-Dienst definiert keinen Fehlervertrag. Deshalb wird jeder von diesem Dienst ausgelöste Fehler als nicht typisierter Fehler behandelt.The back-end service defines no fault contract, so any fault thrown from that service will be treated as an un-typed fault. Löst die Back-End-Dienst eine ApplicationException und WCF bricht den dienstseitigen Kanal ordnungsgemäß ab.The back-end service throws an ApplicationException and WCF correctly aborts the service-side channel. Die ApplicationException wird dann als FaultException für den Vermittler ausgelöste Ausnahme ausgegeben.The ApplicationException then surfaces as a FaultException that is thrown to the intermediary. Der Vermittler löst die ApplicationException erneut aus.The intermediary re-throws the ApplicationException. WCF interpretiert diese als nicht typisierten Fehler vom Vermittler und leitet den Fehler an den Client weiter.WCF interprets this as an un-typed fault from the intermediary and forwards it on to the client. Bei Empfang des Fehlers lösen der Vermittler und der Client Fehler für ihre clientseitigen Kanäle aus.Upon receiving the fault, both the intermediary and the client fault their client-side channels. Der dienstseitige Kanal des Vermittlers bleibt jedoch geöffnet, da WCF nicht weiß, ob es sich um einen schwerwiegenden Fehler handelt.The intermediary’s service-side channel however remains open because WCF doesn’t know the fault is fatal.

Für dieses Szenario wird empfohlen, zu bestimmen, ob der vom Dienst stammende Fehler schwerwiegend ist, und wenn er schwerwiegend ist, sollte der Vermittler einen Fehler für seinen dienstseitigen Kanal auslösen, wie im folgenden Codeausschnitt gezeigt.The best practice in this scenario is to detect if the fault coming from the service is fatal and if so the intermediary should fault its service-side channel as shown in the following code snippet.

catch (Exception e)  
{  
    bool faulted = service.State == CommunicationState.Faulted;  
    service.Abort();  
    if (faulted)  
    {  
        throw new ApplicationException(e.Message);  
    }  
    Else  
    {  
        throw;  
    }  
}  

Siehe auchSee Also

WCF-FehlerbehandlungWCF Error Handling
Angeben und Behandeln von Fehlern in Verträgen und DienstenSpecifying and Handling Faults in Contracts and Services