Errore di eccezione personalizzata del servizio Web WCF al client

Vorrei lanciare un’eccezione personalizzata come un messaggio di errore come eccezione dal servizio web WCF e provare a ricevere questo messaggio di errore di eccezione nell’app client sul metodo di chiamata del servizio web.

come generare eccezioni personalizzate dal servizio web WCF e ricevere lo stesso errore di eccezione sul lato client.

Metodo di servizio Web WCF:

public bool Read() { if (IsUserValid() == false) { throw new Exception("Authorized user"); } } 

Al lato del cliente

 try { _client.Read(); } catch (Exception e) { MessageBox.Show(e.Message); return; } 

Risultato: genera sempre un messaggio di errore come eccezione ** es

“System.ServiceModel.FaultException: il server non è stato in grado di elaborare la richiesta a causa di un errore interno. Per ulteriori informazioni sull’errore, triggersre IncludeExceptionDetailInFaults (da ServiceBehaviorAttribute o dal comportamento di configurazione) sul server per inviare il restituire le informazioni di eccezione al client o triggersre la traccia secondo la documentazione dell’SDK di Microsoft .NET Framework 3.0 e ispezionare i log di traccia del server. ”

Questo è il codice sta generando un’eccezione ma non sta restituendo lo stesso messaggio di errore generato dal servizio web WCF come errore di eccezione

Si prega di suggerire

In WCF, non dovresti lanciare eccezioni .NET standard – questo è contrario alla natura potenzialmente interoperabile di WCF – dopotutto, il tuo client potrebbe essere un client Java o PHP che non ha alcun concetto di eccezioni .NET.

Invece, è necessario lanciare FaultExceptions (che è il comportamento standard per WCF).

Se vuoi restituire maggiori informazioni su cosa è andato storto, guarda i tipi generici di FaultException :

SERVER:

 public bool Read() { if (IsUserValid() == false) { throw new FaultException("User invalid"); } } 

Oppure in alternativa (come suggerito da @MortenNorgaard):

 public bool Read() { if (!IsUserValid()) { InvalidUserFault fault = new InvalidUserFault(); FaultReason faultReason = new FaultReason("Invalid user"); throw new FaultException(fault, faultReason); } } 

Cliente :

 try { _client.Read(); } catch (FaultException e) { MessageBox.Show(e.Message); return; } 

È necessario dichiarare InvalidUserFault come contratti di dati WCF e definire quali membri potrebbero viaggiare indietro con quel tipo (es. Codice di errore, messaggio di errore ecc.).

  [DataContract] [Serializable()] public class BusinessFault { ... add your fault members here } 

E dovresti quindi decorare i tuoi metodi di servizio con i possibili errori che può generare:

 [FaultContract(typeof(InvalidUserFault)] [OperationContract] public bool Read() ..... 

Ovviamente, l’hack “quick’n’dirty” consiste semplicemente nel definire che il server restituisce i dettagli delle eccezioni in FaultExceptions:

      

e quindi è ansible esaminare il valore .Detail di .Detail per l’effettiva eccezione che si è verificata sul server, ma ancora una volta: si tratta più di una modifica al tempo di sviluppo che di una soluzione reale.

Marc

Per far funzionare tutto questo devi fare due cose:

  • Definire il contratto di guasto nell’interfaccia (contratto WCF)
  • Lancia l’eccezione come eccezione di errore