2009-07-20 16 views
6

Il mio metodo di servizio Web restituisce un oggetto di raccolta, che verrà serializzato correttamente, grazie al modo in cui funzionano i servizi Web C#!Come restituire gli errori da un servizio Web ASMX?

Ma se il mio codice genera un'eccezione non rilevata, voglio invece restituire un oggetto errore personalizzato.

È possibile utilizzare C# ASP.NET v2?

Per esempio,

normale funzionamento dovrebbe ritornare:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

Ma in caso di errore voglio

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

Si noti che i servizi Web ASMX non supportano correttamente gli errori SOAP. Il WSDL generato non definirà i guasti, facendo in modo che alcuni client li ignorino o restituiscano errori fatali quando vengono ricevuti. Utilizzare WCF invece per evitare questo problema. –

risposta

7

Sì, questo è possibile.

Ciò che è necessario esaminare è lo SoapException class e in particolare lo Detail property della classe SoapException.

La classe SoapException eseguirà effettivamente il rendering di "Soap Fault", ovvero il meccanismo conforme agli standard per la restituzione delle informazioni di errore ai client/consumatori da un metodo di servizio Web.

La proprietà "Dettaglio" della classe SoapException è di tipo XmlNode e può quindi contenere un singolo nodo/elemento o una gerarchia di nodi figlio. Il nodo Dettagli potrebbe quindi facilmente contenere e agire da "genitore" per la rappresentazione serializzata del proprio oggetto di errore personalizzato.

Da MSDN:

La proprietà Particolare è destinato per la fornitura di applicativi specifici dettagli di errore relativi all'elemento corpo della richiesta SOAP. In base alla specifica SOAP, se si verifica un errore perché la richiesta del client non può essere elaborata a causa dell'elemento Body della richiesta SOAP, è necessario impostare la proprietà Detail. Se si verifica un errore nelle voci di intestazione della richiesta SOAP, è necessario lanciare una SoapHeaderException, in modo che i dettagli dell'errore vengano restituiti nell'intestazione SOAP. Se l'errore non si verifica, a causa dell'elaborazione dell'elemento Body, la proprietà Detail non deve essere impostata.

Nella creazione di un XmlNode per la proprietà Detail, le proprietà Name e Namespace di DetailElementName possono essere utilizzate per garantire l'uniformità [sic] con le specifiche SOAP.

Tutti gli elementi figlio immediati dell'elemento dettaglio sono chiamati voci di dettaglio e ogni voce di dettaglio è codificata come elemento indipendente all'interno dell'elemento dettaglio.

Si noti che se si vuole rimanere correttamente SOAP compatibile con le risposte del servizio web, è necessario restituire un SoapHeaderException piuttosto che un SoapException se l'errore si verifica all'interno della sezione di intestazione del cliente della richiesta XML originale (questo può essere spesso il caso quando si utilizza custom SOAP headers per es. credenziali di sicurezza) come descritto sopra.

+0

Potresti fornire un esempio? –

+0

@JL - Il collegamento alla classe SoapException nella mia risposta (primo collegamento) contiene un codice di esempio in VB e C# per generare un messaggio di errore "personalizzato". Certo, crea la proprietà Detail creando e aggiungendo manualmente un oggetto XmlNode, ma questo potrebbe essere sostituito da un qualche Xml creato dalla serializzazione del proprio oggetto, magari usando la classe System.Xml.Serialization.XmlSerializer. Vedi qui: http://support.microsoft.com/kb/815813 – CraigTP

+0

Risposta assolutamente perfetta! Grazie Craig ... Consiglio vivamente a tutti coloro che cercano di restituire un oggetto errore personalizzato piuttosto che l'eccezione SOAP standard. È standardizzato, quindi è facile giustificare l'adozione di tale azione. –

Problemi correlati