Domanda

Sto scrivendo un servizio WCF per la prima volta.Il servizio e tutti i suoi client (almeno per ora) sono scritti in C#.Il servizio deve eseguire molta convalida dell'input sui dati che viene trasmesso, quindi è necessario avere un modo per indicare i dati non validi al client.Ho letto molto su difetti ed eccezioni, su come racchiudere le eccezioni in difetti e su molti articoli contrastanti che mi confondono ulteriormente.Qual è il modo corretto di gestire questo caso?

Dovrei evitare del tutto le eccezioni e confezionare un messaggio di ritorno dei risultati?Dovrei creare un errore speciale o un'eccezione speciale o semplicemente lanciare ArgumentException come farei per una funzione di convalida non WCF?

Il codice che ho adesso (influenzato da MSDN) È:

[DataContract]
public class ValidationFault
{
    [DataMember]
    public Dictionary<string, string> Errors { get; private set; }

    [DataMember]
    public bool Fatal { get; private set; }

    [DataMember]
    public Guid SeriesIdentifier { get; private set; }

    public ValidationFault(Guid id, string argument, string error, bool fatal)
    {
        SeriesIdentifier = id;
        Errors = new Dictionary<string, string> {{argument, error}};
        Fatal = fatal;
    }

    public void AddError(string argument, string error, bool fatal)
    {
        Errors.Add(argument, error);
        Fatal |= fatal;
    }
}

E nel metodo c'è [FaultContract(typeof(ValidationFault))].Quindi è questo il modo "giusto" di affrontare la questione?

È stato utile?

Soluzione

Se stai eseguendo la convalida sul client e dovresti avere valori validi una volta passati al metodo (la chiamata al servizio Web), genererei un'eccezione.Potrebbe trattarsi di un'eccezione che indica che un parametro non è valido con il nome del parametro.(Vedere:ArgumentException)

Ma potresti non voler fare affidamento sul client per convalidare correttamente i dati e questo ti lascia con il presupposto che i dati potrebbero non essere validi quando entrano nel servizio web.In tal caso non si tratta veramente di un caso eccezionale e non dovrebbe costituire un’eccezione.In tal caso potresti restituire un'enumerazione o un oggetto Risultato con una proprietà Status impostata su un'enumerazione (OK, Non valido, Incompleto) e una proprietà Message impostata con specifiche, come il nome del parametro.

Mi assicurerei che questo tipo di errori vengano rilevati e corretti durante lo sviluppo.Il processo di QA dovrebbe testare attentamente gli usi validi e non validi del client e non si desidera inoltrare questi messaggi tecnici al client.Quello che vuoi fare invece è aggiornare il tuo sistema di convalida per impedire che dati non validi arrivino alla chiamata di servizio.

Il mio presupposto per qualsiasi servizio WCF è che sarà presente più di un'interfaccia utente.Una potrebbe essere un'interfaccia utente Web ora, ma in seguito potrei aggiungerne un'altra utilizzando WinForms, WinCE o anche un'applicazione mobile nativa per iPhone/Android che non è conforme a ciò che ti aspetti dai client .NET.

Altri suggerimenti

Lanciare un'eccezione non è utile da un servizio WCF Perché no?Perché si ripresenta come una colpa nuda e tu ne hai bisogno

a) Impostare l'errore per includere le eccezioni

b) Analizzare l'errore per ottenere il testo dell'eccezione e vedere cosa è successo.

Quindi sì, hai bisogno di una colpa piuttosto che di un'eccezione.Nel tuo caso, creerei un errore personalizzato che contiene un elenco dei campi che non hanno superato la convalida come parte del contratto di errore.

Tieni presente che WCF fa cose divertenti con i dizionari, che non sono ISerializable;ha una gestione speciale, quindi controlla che il messaggio in ritorno sia ben visibile in rete;in caso contrario, torniamo agli array per te.

potresti voler dare un'occhiata al blocco di convalida della libreria aziendale di MS Patterns and Practices insieme al blocco di policy injection testo del collegamento ti consente di decorare i membri del tuo contratto dati con attributi di convalida e anche di decorare l'implementazione del servizio, questo insieme alla sua integrazione con WCF significa che gli errori di convalida vengono restituiti automaticamente come errori ArgumentValidationException, ciascuno contenente un oggetto ValidationDetail per ogni errore di convalida.

Usando entlib con WCf puoi ottenere molta convalida e segnalazione degli errori senza dover scrivere molto codice

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