2009-06-19 14 views
11

Non sono sicuro di essere completamente soddisfatto del fatto che il lancio di eccezioni nei servizi Web sia una buona idea. Non mi dispiacerebbe tanto se non fosse per la traccia dello stack. Questo non è qualcosa che non voglio.Se i servizi web generano eccezioni O oggetti risultato

Ho studiato diverse implementazioni e non sembra esserci un consenso su questo. Ad esempio, CampaignMonitor restituisce un oggetto Result, mentre altri no.

Architettonicamente, non sono sicuro che restituire un oggetto di ritorno abbia senso, sicuramente un'eccezione è un'eccezione, ma quello che mi piace di un oggetto Return è che è una soluzione più elegante per l'utente finale.

Qualcuno ha soluzioni migliori?

EDIT

BTW sto usando i servizi web ASMX, dove girando CustomErrors su non è un'opzione.

+0

In realtà, credo che il modo per rimuovere i dettagli delle eccezioni sia giocando con il tag customErrors in web.config. Credici o no. –

+0

@ John: Sì, questo è quello che sto dicendo qui. Purtroppo questa non è un'opzione per me. Altrimenti sarebbe un problema molto più semplice per me :(. –

risposta

6

Quale traccia di stack stai parlando? Hai provato questo?

In entrambi i servizi ASMX e WCF, un'eccezione non rilevata verrà convertita in un errore SOAP. In entrambi i casi, possono essere configurati per non includere alcuna traccia dello stack. In realtà, questo è il valore predefinito in WCF.

Quindi, il modo corretto per restituire un errore di questo tipo è un errore. Un modo per generare errori consiste nel lanciare e non gestire un'eccezione.

+0

In sostanza tutto ciò che voglio informare l'utente è un'eccezione con un codice di errore e una descrizione (di mia scelta) .Penso che ci sia una differenza semantica tra la gestione delle eccezioni per i servizi Web e per l'architettura delle applicazioni, ma non sono sicuro se debbano essere trattati diversamente. Non restituirai un oggetto Result nel codice quando c'è un errore, i servizi web dovrebbero essere diversi. Suppongo che la mia domanda sia: come faccio a astrarre i dettagli delle eccezioni? –

+2

Leggere su errori SOAP: questo è il modo standard per restituire dettagli arbitrari a un client. Nei servizi Web ASMX, è necessario restituirli "a mano" nel dettaglio proprietà di un'istanza SoapException, ma è il modo giusto se devi stare con ASMX. Naturalmente il modo migliore è usare WCF. Inoltre, non pensarci come informare gli utenti sulle eccezioni. dettagli di implementazione. Li stai informando di un errore. –

+0

Questo non è ciò che osservo. I miei servizi Web ASMX restituiscono tutte le tracce di stack con le impostazioni predefinite e mi fanno impazzire. E quando c'è una catena di servizi che si chiama l'un l'altro, e l'ultimo nella catena, il client riceve un'enorme traccia di stack da tutti i servizi partecipanti (nella forma di un 'SoapException' la proprietà' Message' di cui contiene lo stack traccia come testo concatenato). Questo è orribile e non ho idea di come spegnerlo. – GSerg

0

Potete chiarire un po '? Il lato server di un servizio Web può generare un'eccezione. Il lato server di un servizio Web può restituire un messaggio al lato client. Questo messaggio può contenere informazioni di errore e tali informazioni di errore possono includere in modo specifico i dettagli delle eccezioni. O forse no. Sul lato client, in genere si dispone di un proxy generato per gestire il messaggio dal server. Questo proxy può generare un'eccezione se tale risposta contiene informazioni di errore.

Quale parte di questo scenario ti stai chiedendo?

+0

@Bruce: le eccezioni non rilevate verranno convertite in errori.In alcune circostanze, quelli includeranno dettagli di eccezione. –

+0

@Bruce: Capisco come funzionano i servizi web, intendo più di un progetto di architettura. Ci sono casi in cui ho bisogno di lanciare eccezioni. In questi casi, le informazioni di traccia dello stack vengono serializzate sul client. Non penso sia una buona idea. Qual è il modo migliore per nascondere i dettagli? O è la risposta per restituire un oggetto "Ritorna" (l'esempio che ho dato di questo era l'esempio di api CampaignMonitors). –

+0

@Ryan: utilizza tutte le combinazioni del tag customeError in web.config. Credo che uno di questi giri le tracce dello stack. –

0

Suppongo che il lancio di eccezioni sia in generale un modello di progettazione migliore che restituisca un risultato. Suppongo che si deve fare è dentro i vostri servizi web per nascondere traccia dello stack applicando il seguente schema per ogni metodo esposto come servizio Web:

public void MyWebServiceMethod() {
try
{

///Do something that may cause an error 

} catch(Exception ex)
{ throw new ApplicationException("User friendly descritption of exception");

}

}

oppure si può anche

catch(Exception ex) { throw ex; }

Se Rilanciare un'eccezione, nasconderai la traccia dello stack originale dai client dei tuoi servizi web.

+0

@Bogdan: in primo luogo, MS ha deprecato ApplicationException di nuovo in .NET 1.1. Usa invece "Eccezione". In secondo luogo, ho l'impressione che l'OP non voglia affatto traccia dello stack. –

+1

@John, per ApplicationException intendevo qualsiasi eccezione personalizzata. Ok, diciamo che dovrebbe essere MyWebServiceException o qualcosa del genere. Inoltre, in effetti non è deprecato ed eccezioni come System.Threading.WaitHandleCannotBeOpenedException ereditano comunque da questo. MS dice solo che non pensano che sia molto prezioso, ma comunque quello che usi come classe base per le tue eccezioni è naturalmente la tua scelta, che a volte è dettata anche dalle convenzioni di codifica che devi rispettare nel progetto corrente. –

8

Non lasciare che il fatto di essere in un servizio Web confonda il problema. Questo è solo un dettaglio di implementazione.

Utilizzare la normale strategia di gestione delle eccezioni. Le migliori pratiche dicono che non intercettano le eccezioni nel codice di basso livello, a meno che tu non possa risolvere quell'eccezione e continuare normalmente. È necessario aumentare le eccezioni al livello di presentazione in modo che l'utente possa essere informato dell'errore.

Quindi, come applicato ai servizi Web - in generale genera eccezioni (che risulta in un SoapFault). Ciò consente al codice client di richiamo di utilizzare lo standard di gestione delle eccezioni incorporato per gestirlo.

+0

@Maladon: questa è una buona risposta, tranne che sui confini del livello. In generale, le strategie cambiano ai limiti dei livelli, specialmente a livello di servizio. In particolare, per WCF, un limite di livello sarebbe un buon posto per individuare l'eccezione "A" e ripristinarla con FaultException , che invierà l'errore AFault SOAP. Nessuna traccia di stack, BTW. ASMX non supporta correttamente gli errori; ancora un altro motivo per smettere di usarlo. –

2

un approccio è quello di separare gli errori di sistema e di business. (Errore di sistema: ad esempio richiesta errata, utente non autorizzato, ecc., Errore di business: ad esempio, il metodo UpdateCars genera un errore, l'utente non possiede alcuna macchina).

In caso di un errore aziendale, restituire un oggetto risposta contenente una descrizione dell'errore; in caso di errore di sistema, lanciare un'eccezione.

+1

La specifica SOAP fornisce gli errori per restituire condizioni di errore e devono essere utilizzati. In caso contrario, i tuoi clienti torneranno a dover ricordare per verificare i valori di ritorno degli errori e non saranno in grado di utilizzare la loro traduzione specifica della piattaforma dei guasti. –

0

Non vedo perché non puoi fare entrambe le cose? Catch l'eccezione, registrarlo (su un DB o su un file), quindi restituire un codice di errore. In questo modo si esegue in modo aggraziato la chiamata al servizio web e si notifica anche l'errore, e si dispone di un punto altrove è possibile eseguire ulteriori debug.

+0

@James: attenersi allo standard potrebbe essere migliore. Prevede i difetti, quindi perché non usarli? Inoltre, gli sviluppatori dimenticano di controllare i codici di errore. Ecco perché sono state inventate le eccezioni e gli errori SOAP sono la versione del servizio Web delle eccezioni. –

+0

Come dice @John, e sono d'accordo, le eccezioni ci sono per informare di un errore. Le eccezioni verranno serializzate in un errore SOAP. Di conseguenza, restituire un codice di errore non si adatta molto bene al protocollo. Vedi sotto: http://msdn.microsoft.com/en-us/library/ds492xtk(VS.85).aspx –