Attualmente stiamo discutendo se sia meglio lanciare i guasti su un canale WCF, anziché passare un messaggio che indica lo stato o la risposta di un servizio.WCF - Guasti/Eccezioni rispetto ai messaggi
Gli errori vengono forniti con il supporto integrato di WCF, dove è possibile utilizzare i gestori di errori incorporati e reagire di conseguenza. Ciò, tuttavia, comporta un sovraccarico poiché le eccezioni di lancio in .NET possono essere piuttosto costose.
I messaggi possono contenere le informazioni necessarie per determinare cosa è successo con la chiamata di servizio senza il sovraccarico di generare un'eccezione. Tuttavia necessita di diverse righe di codice ripetitivo per analizzare il messaggio e determinare le azioni che seguono il suo contenuto.
Abbiamo preso una pugnalata alla creazione di un oggetto messaggio generico potremmo utilizzare nei nostri servizi, e questo è ciò che siamo venuti su con:
public class ReturnItemDTO<T>
{
[DataMember]
public bool Success { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public T Item { get; set; }
}
Se tutte le mie chiamate di servizio restituire questo articolo, posso sempre controllare la proprietà "Success" per determinare se tutto è andato bene. Ho quindi una stringa di messaggi di errore nell'evento che indica che qualcosa è andato storto e un oggetto generico contenente un Dto se necessario.
Le informazioni sulle eccezioni devono essere registrate su un servizio di registrazione centrale e non vengono restituite dal servizio.
Pensieri? Commenti? Idee? Suggerimenti?
Alcuni ulteriori chiarimenti sulla mia domanda
Un problema che sto avendo con contratti di guasto sta comunicando le regole di business.
Come se qualcuno effettuasse l'accesso e il suo account fosse bloccato, come posso comunicarlo? Il loro accesso ovviamente fallisce, ma fallisce a causa del motivo "Account bloccato".
Anch'io:
a) utilizzare un valore booleano, lanciare dei guasti con l'account messaggio bloccato
B) tornare AuthenticatedDTO con informazioni pertinenti
Non sono d'accordo. Poiché WCF dovrebbe essere indipendente dalla lingua (in qualche modo, almeno) non è possibile garantire che il passaggio di un oggetto Exception lungo il wire non causi problemi di buig per es. Client Java. Il tipo di oggetto FaultContract può garantire l'interoperabilità poiché fa parte delle specifiche OASIS. – ZombieSheep
.NET converte le eccezioni in contratti di errore. Vedi il link che ho aggiunto alla mia risposta. –
Ho sempre avuto l'impressione che il lancio di un'eccezione non fosse necessario. Dal tuo post mi sembra di essere stato tristemente fuorviato. Prima di contrassegnare questo post come l'asnwer, voglio ottenere più opinioni. Ma considerando il tuo input, sembra che il contratto di guasto sia l'opzione migliore – WebDude