Domanda

Ho uno SVC WCF separato in un Service Layer, Business Layer Logica e Data Access Layer.

Quando il mio DAL rileva un'eccezione, dovrei prenderla lì o lasciare che bolla indietro fino al livello di servizio? E perché?

Si prega di ignorare qualsiasi coinvolgimento del cliente per questo scenario, sono preoccupato solo con la registrazione le eccezioni sulla svc WCF.

È stato utile?

Soluzione

Dipende anche da come si sta architecting la vostra soluzione. Per esempio, se gli strati DAL e BLL sono destinate ad essere componenti totalmente indipendenti, quindi non possono fare ipotesi su chi li sta chiamando. Come tali, essi dovrebbero entrambe le eccezioni di cattura sul confine componente, log tali eccezioni, quindi consentire l'eccezione per propagarsi. Si può decidere di avvolgere l'eccezione generale un'eccezione strato-specifica:

catch (Exception ex)
{
    Logger.Log(ex);
    throw new DalException("Unhandled exception in DAL", ex);
}

Se sa che saranno utilizzati solo come parte della vostra applicazione complessiva, allora si può rinviare la registrazione per lo strato più esterno - il livello che, se non si cattura l'eccezione, l'eccezione non sarà registrata.

Altri suggerimenti

C'è un termine per questo - Eccezione di schermatura. In sostanza si dovrebbe evitare SISTEMA eccezioni di viaggiare a livello superiore, perché questo potrebbe dare un'atacker vista l'architettura del sistema. WCF Eccezione schermatura può intercettare le eccezioni di certo tipo e sostituirli con le eccezioni di altro tipo. Per esempio potrebbe prendere eccezione StackOverflow e sostituirlo con la vostra SystemException personalizzato. Se si utilizza Enterprise Library si potrebbe anche configurare il login queste eccezioni quando essi vengono sostituiti

Utilizzando la Gestione delle eccezioni di blocco in Enterprise Library 3.0

credo che dipende da come il servizio è consumato e che (se qualcuno) che si desidera a conoscenza quando si verifica un'eccezione.

Ad esempio, se si sta sviluppando un'applicazione aziendale interna mission-critical, si consiglia i dettagli di eccezione alla bolla attraverso il livello di servizio per l'interfaccia utente che consuma l'applicazione in modo da utente finale può contattare un sviluppatore di ottenere rapidamente il problema risolto.

Comunque, diciamo che il vostro servizio è consumato da una pagina web pubblica. Probabilmente si vuole ancora il livello di servizio per rilevare l'errore in qualche modo, ma si può scegliere di passare informazioni minime al cliente finale, di fornire un messaggio di errore generico per l'utente finale, e scrivere i dettagli dell'eccezione per un log degli errori per Gli sviluppatori rispetto alla revisione.

Alla fine, penso ancora che si desidera l'eccezione a bollire fino al livello di servizio, ma come gestire l'eccezione e decidere quali informazioni da passare al cliente finale spetta a voi.

Io di solito uso un gestore di errore generico (attuazione System.ServiceModel.Dispatcher.IErrorHandler) che è collegato ai servizi web da un ServiceBehavior nel file di configurazione.

Il metodo IErrorHandler.ProvideFault intercetta eccezioni generate dal servizio e:

  • Registri loro;

  • Passa attraverso FaultExceptions così com'è;

  • Converte i "business" eccezioni (ad esempio regole di business violazioni) generate dal BLL per FaultExceptions con un codice di errore "mittente / client";

  • Converte eccezioni tecniche (ad esempio generate dal DAL) a FaultExceptions con un codice di errore "del ricevitore / server".

In questo modo il codice di servizio in sé contiene solo il codice di business e non ha bisogno di catturare tutte le eccezioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top