Domanda

Il mio gruppo sta sviluppando un'applicazione basata su servizi (.NET WCF) e stiamo cercando di decidere come gestire le eccezioni nei nostri servizi interni.Dovremmo lanciare eccezioni?Restituire eccezioni serializzate come XML?Restituisci semplicemente un codice di errore?

Tieni presente che l'utente non vedrà mai queste eccezioni, ma solo per altre parti dell'applicazione.

È stato utile?

Soluzione

WCF utilizza SoapFaults come modo nativo di trasmettere le eccezioni dal servizio al client o dal client al servizio.

È possibile dichiarare un errore SOAP personalizzato utilizzando il file FaultContract attributo nell'interfaccia del contratto:

Per esempio:

[ServiceContract(Namespace="foobar")]
interface IContract
{
    [OperationContract]
    [FaultContract(typeof(CustomFault))]
    void DoSomething();
}


[DataContract(Namespace="Foobar")]
class CustomFault
{
    [DataMember]
    public string error;

    public CustomFault(string err)
    {
        error = err;
    }
}

class myService : IContract
{
    public void DoSomething()
    {
        throw new FaultException<CustomFault>( new CustomFault("Custom Exception!"));
    }
}

Altri suggerimenti

Bene, perché non lanciare semplicemente le SOAPException standard?Il problema con i codici di errore e l'XML serializzato è che entrambi richiedono una logica aggiuntiva per riconoscere che un errore si è effettivamente verificato.Un approccio di questo tipo è utile solo se si dispone di una registrazione o di una logica specializzata che deve avvenire dall'altra parte del servizio Web.Un esempio del genere restituirebbe un flag che dice "è possibile continuare" con un rapporto di eccezione di errore.

Indipendentemente da come lo lanci, non renderà il lavoro più semplice, poiché la parte chiamante deve comunque riconoscere che c'è stata un'eccezione e affrontarla.

Sono un po' confuso, non sono irriverente: dici che vuoi restituire le eccezioni serializzate come XML da un lato e che l'utente non vedrà mai le eccezioni dall'altro.Chi vedrà queste eccezioni?

Normalmente direi di utilizzare contratti di errore WCF.

Phil, diverse parti dell'applicazione si chiamano tra loro utilizzando WCF.Con "eccezioni restituite serializzate come XML" intendevo che il valore restituito della funzione sarebbe stato un oggetto eccezione.Il successo verrebbe indicato da null.

Non penso che sia l'opzione giusta.

I contratti di errore WCF sembrano buoni, ma non ne so nulla.Sto controllando Google adesso.

Eviterei di inviare le eccezioni direttamente al cliente a meno che tu non sia d'accordo con la restituzione di tutti i dettagli.

Consiglierei di utilizzare gli errori WCF per trasmettere il messaggio e il codice di errore (qualcosa che può essere utilizzato per decidere sul destinatario di riprovare, eliminare l'errore e così via) a seconda che sia il mittente o il destinatario a essere in errore.

Questo può essere fatto utilizzando FaultCode.CreateReceiverFaultCode e FaultCode.CreateSenderFaultCode.

Sto affrontando questo problema proprio ora, ma sembra che si sia verificato un brutto intoppo nella risposta SOAP 1.1 generata da un errore WCF.Se sei interessato, puoi leggere la mia domanda a riguardo qui:

Errori WCF .NET che generano valori del codice errore SOAP 1.1 errati

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