2009-03-26 13 views
6

Ora sto giocando con WebServices, utilizzando il framework .NET (file .asmx, non WCF). Mi chiedo quale sia la prassi migliore per dire all'utente che si è verificata una sorta di errore aziendale nella chiamata al metodo.Best practice per la gestione degli errori in un servizio Web

mio piccolo test-case:

ho sonde di misura che devono registrarsi con un server centrale. Ogni sonda dovrebbe avere un indirizzo fisico diverso. Per iscriversi, si deve chiamare (tramite un servizio web):

[WebMethod] 
public void RegisterReadingStation(out Guid sessionId, Int64 physicalAddress) 

Ora, la firma non è scolpito nella pietra - in realtà, questo è quello che sto cercando di capire. :) Ho bisogno di avvisare in qualche modo il probe se sta tentando di registrarsi usando un indirizzo fisico che è già stato preso.

Il mio modo di vedere, ho avuto un paio di possibilità:

  • gettare un SoapException contenente le informazioni. Tuttavia, un string :: message non è così facile da eseguire controlli programmatici.
  • Utilizzare una sorta di classe valore come parametro di ritorno (o anche più semplice, enum). Se faccio questo, suppongo di dover serializzare manualmente/deserializzare la classe sul server/client?

Qualche idea su questo?

risposta

1

Penso che il consenso comune sarebbe utilizzare un codice di ritorno personalizzato (intero). Finché il servizio documenta quali sono i possibili codici di ritorno, questo dovrebbe essere fattibile.

+0

Eek, ritorno ai C-giorni. Il problema con questo approccio è che non è molto flessibile. Non è possibile aggiungere messaggi di errore personalizzati come uno stacktrace o un messaggio o ... Posso vedere che questa sarebbe la soluzione facile e multi-compatibile. – cwap

+0

Ho un apprezzamento acquisito per i servizi Web che errano dal lato della semplicità. –

+0

Anche se questa non è la risposta più votata, la accetterò. Mi piace l'aspetto di "Webservices dovrebbe essere semplice da usare", quindi questo è ciò a cui mi stavo attenendo per ora :) – cwap

5

Restituisco una classe piccola denominata ResultSet da ciascun WebMethod, che contiene un codice di errore int e un errore di stringa.

Questo ti dà un facile controllo per errori/successo, e alcuni dettagli se le cose vanno male.

Se il WebMethod deve restituire i dati, erediterò da ResultSet per fornire un ResultSet specifico per includere anche i dati.

+0

Sì, era dove stavo andando pure :) – cwap

+0

Ma cosa fare quando la funzione del servizio web dovrebbe restituire un oggetto come employeeData quando tutto va bene e dovrebbe restituire un messaggio di errore quando c'è errore.Come restituire due oggetti diversi dalla stessa funzione in scenari diversi? –

+0

Quello che ho fatto è stato creare una nuova classe chiamata EmployeeDataResultSet, che eredita da ResultSet. Quindi ho aggiunto una proprietà a EmployeeDataResultSet che è la classe EmployeeData. Bascially, incapsula i dati dei tuoi dipendenti nel tuo ResultSet. – Moose

Problemi correlati