2010-08-17 16 views
8

Desidero personalizzare le eccezioni/errori generate dal servizio dati WCF, in modo che i client ottengano il maggior numero di informazioni su cosa è andato storto/cosa è andato perso. Qualche idea su come questo potrebbe essere raggiunto?Gestione delle eccezioni con i servizi dati WCF

risposta

0

È necessario creare eccezioni personalizzate per questo. Si prega di leggere questo post qui: Why Create Custom Exceptions?

In quale lingua si sta sviluppando?

Se avete bisogno di ulteriori indicazioni, si prega di aggiungere alcuni commenti.

+0

sto sviluppando in C#. Tuttavia, le eccezioni che butto dal servizio non raggiungono i clienti che consumano il servizio. – Martinfy

0

Non penso che voglia sapere come gettare/catturare le eccezioni in .NET.

Probabilmente vorrebbe avere dei pensieri su come dire ai clienti che consumano un Servizio Dati WCF che qualcosa (e cosa) è andato storto quando un'eccezione viene lanciata/catturata sul lato server (servizio).

I servizi dati WCF utilizzano i messaggi di richiesta/risposta HTTP e non è possibile semplicemente lanciare un'eccezione dal servizio al client.

3

Potete decorare la vostra classe di servizio con questo attributo ServiceBehaviorAttribute in questo modo:

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class PricingDataService : DataService<ObjectContext>, IDisposable 
{ 
    ... 
} 
10

Ci sono alcune cose che dovete fare per garantire eccezioni bolla sopra il tubo HTTP al client.

  1. Devi attribuire la classe DataService con il seguente:

    [ServiceBehavior (IncludeExceptionDetailInFaults = true)] MyDataService public class: DataService

  2. È necessario abilitare errori verbose nella configurazione:

    vuoto statico pubblico InitializeService (configurazione DataServiceConfiguration) { config.UseVerboseErro rs = true; }

è meglio gettare DataServiceException all'interno. Il runtime del servizio dati WCF sa come associare le proprietà alla risposta HTTP e lo avvolge sempre in un TargetInvocationException.

[WebGet] 
public Entity OperationName(string id) 
{ 
    try 
    { 
     //validate param 
     Guid entityId; 
     if (!Guid.TryParse(id, out entityId)) 
      throw new ArgumentException("Unable to parse to type Guid", "id"); 

     //operation code 
    } 
    catch (ArgumentException ex) 
    { 
     throw new DataServiceException(400, "Code", ex.Message, string.Empty, ex); 
    } 
} 

È quindi possibile decomprimere questo per il consumatore cliente sovrascrivendo il HandleException nel vostro DataService in questo modo:

/// <summary> 
/// Unpack exceptions to the consumer 
/// </summary> 
/// <param name="args"></param> 
protected override void HandleException(HandleExceptionArgs args) 
{ 
    if ((args.Exception is TargetInvocationException) && args.Exception.InnerException != null) 
    { 
     if (args.Exception.InnerException is DataServiceException) 
      args.Exception = args.Exception.InnerException as DataServiceException; 
     else 
      args.Exception = new DataServiceException(400, args.Exception.InnerException.Message); 
    } 
} 

Vedi here per ulteriori informazioni ...