2009-07-10 11 views
5

A seguito di una domanda here mi ha fatto pensare ....Passare un oggetto eccezione ad un webservice

sarebbe/è mai possibile che quando un'applicazione rileva un'eccezione non gestita per questo oggetto eccezione a essere serializzato e inviato a un servizio Web con un backb db. Quindi, utilizzando un'utilità o anche all'interno di Visual Studio, l'oggetto eccezione potrebbe essere caricato dal db e controllato ??

Questo sarebbe possibile? Immagino che la prima domanda sia se è possibile serializzare oggetti di eccezione.

risposta

-1

Non è necessario. Basta registrare l'eccezione.

Se si desidera collegarlo a un database, andare avanti. A questo scopo è possibile utilizzare il blocco applicazioni di registrazione della libreria aziendale.

+0

Sì, è possibile registrare l'eccezione su disco ma ciò non è molto utile per uno sviluppatore quando non ha accesso alla macchina in cui si è verificata l'eccezione. L'idea è di 1) Informare lo sviluppatore che si è verificato un errore e 2) Fornire loro tutte le informazioni che consentiranno loro di rintracciare il problema piuttosto che ricevere una email che dice "La tua applicazione si è bloccata" – Calanus

+0

Ho detto che puoi loggarlo un database. Il blocco di registrazione può farlo. –

+2

Sì, ma è possibile accedere al database solo se si ha accesso diretto al db in questione, il che potrebbe non essere sempre il caso – Calanus

3

È possibile serializzare oggetti di eccezione. Questo è infatti necessario per trasportare un oggetto eccezione dal server al client, nel caso in cui un'eccezione venga lanciata in una chiamata al servizio web. Questo è il motivo per cui System.Exception ha un constructor overload that creates an exception object from serialized data.

esempio di codice per la serializzazione/deserializzazione oggetto eccezione:

private static void SerializeException(Exception ex, Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, ex); 
} 

private static Exception DeserializeException(Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    return (Exception)formatter.Deserialize(stream); 
} 

// demo code 
using (Stream memoryStream = new MemoryStream()) 
{ 
    try 
    { 
     throw new NullReferenceException(); 
    } 
    catch (Exception ex) 
    { 
     // serialize exception object to stream 
     SerializeException(ex, memoryStream); 
     memoryStream.Position = 0; 
    } 
    // create exception object from stream, and print details to the console 
    Console.WriteLine(DeserializeException(memoryStream).ToString()); 
} 

Detto questo, avrei probabilmente accontentarsi per la registrazione del tipo di eccezione, il messaggio e Analisi dello stack da qualche parte in modo che possa esaminare le informazioni.

+0

Serializzare, sì. Serializzare XML, non così bene. –

0

Sì, è possibile, nel caso in cui il software si trovi in ​​un sito remoto, è possibile collegarlo localmente e eseguire il ping periodicamente alla "nave madre", tramite il servizio web.

È un modo abbastanza efficace di raccogliere informazioni sull'eccezione non gestita in natura e risolverle.

Se raccogli la traccia dello stack, solitamente è abbastanza buona da darti un suggerimento in merito al problema. Tuttavia nelle versioni di rilascio non si otterranno numeri di linea.

1

Utilizzando WCF, questo sarebbe un compito facile. Implementare un numero personalizzato IErrorHandler per inviare errori a un servizio di registrazione. La classe FaultException<TDetail> viene utilizzata da WCF per segnalare errori in un formato XML SOAP e può essere inviata direttamente al servizio di registrazione.

1

Bene, ci sono diversi modi per avvicinarsi a questo. In passato, ho fatto semplicemente quello che chiamerei una serializzazione XML super-naive, che ammounted a qualcosa di simile

<exception> 
    <type></type> 
    <Message></Message> 
    <StackTrace></StackTrace> 
    <innerException></innerException> //this would have the same schema as the root exception 
</exception 

e semplicemente passare che. Non avevo bisogno di deserializzare per quello che stavo facendo. Stavo semplicemente registrando la parte tecnica e visualizzando il messaggio all'utente quando il servizio web non funzionava.

Un'altra opzione è semplicemente eseguire una serializzazione binaria su una tabella db, passare la chiave su quella tabella sul filo e reidratare l'eccezione da binario dal db.

Problemi correlati