2009-08-18 6 views
9

Ho un servizio Web in cui ho creato un'eccezione personalizzata. Supponiamo che il nome di questa eccezione sia InvalidContractException.Eccezione personalizzata catch dal servizio Web ASMX

Quello che mi piacerebbe fare è se si verifica un passaggio specifico, voglio lanciare questa eccezione. Tuttavia, non riesco a capire come il client possa intercettare l'InvalidContractException per gestirlo correttamente.

Si tratta di un servizio Web ASP.Net scritto in C#

risposta

17

Non si può fare questo: servizi

  1. web fanno errori SOAP. Le eccezioni sono specifiche della piattaforma.
  2. Quando un'eccezione non è gestita in un servizio Web ASMX, .NET la tradurrà in un errore SOAP. I dettagli dell'eccezione non sono serializzati.
  3. In un client ASMX, un errore SOAP verrà tradotto in una SoapException.

I servizi Web ASMX non supportano correttamente gli errori SOAP. Non c'è modo di ottenere eccezioni se non una SoapException sul lato client.

Ancora un altro motivo per eseguire l'aggiornamento a WCF.


Come esempio di ciò che non può fare con ASMX, ecco come funziona WCF. WCF consente di specificare, per ogni operazione di servizio web, che i guasti si può tornare:

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [FaultContract(typeof(IntegerZeroFault))] 
    [FaultContract(typeof(SomeOtherFault))] 
    [OperationContract] 
    public string GetSomeString(int someInteger); 
} 

[DataContract] 
public class IntegerZeroFault 
{ 
    [DataMember] 
    public string WhichInteger {get;set;} 
} 

[DataContract] 
public class SomeOtherFault 
{ 
    [DataMember] 
    public string ErrorMessage {get;set;} 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetSomeString(int someInteger) 
    { 
     if (someInteger == 0) 
      throw new FaultException<IntegerZeroFault>(
       new IntegerZeroFault{WhichInteger="someInteger"}); 
     if (someInteger != 42) 
      throw new FaultException<SomeOtherFault>(
       new SomeOtherFault{ErrorMessage ="That's not the anaswer"}); 
     return "Don't panic"; 
    } 
} 

client A WCF può quindi catturare FaultException<SomeOtherFault>, per esempio. Quando ho provato questo con un client Java, è stato in grado di catturare SomeOtherFault, che IBM Rational Web Developer ha creato per derivare dalla classe Java Exception.

0

nella chiamata client al servizio WCF che getta il guasto, si fa

provare ..

colpa cattura come FaultException (di YourService.FooBarFault)

fine provare

Devi dichiarare un FaultContract per il metodo di servizio in grado di generare ° e colpa, ad es.

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

Sta usando ASMX. Lo chiama "ASP.NET Web Services" –

+0

Ah ok .. pensavo stesse usando WCF –

5

Se il tuo obiettivo è quello di lanciare un'eccezione in modo che un utente possa sapere che qualcosa è andato storto, si è verificata qualche eccezione specifica e ha una gestione speciale per questo, hai un'opzione. Devi solo fare affidamento su una corretta implementazione del proxy client (in effetti, un'opzione è quella di fornire i proxy del client te stesso).

C'è un articolo utile disponibile here su come funziona SoapException s.

In sostanza, si tratta di codificare i dettagli delle eccezioni (ad esempio un codice di errore) nel nodo dettagli di SoapException e quindi di analizzarli sul lato client prima di rilanciare l'eccezione.

Non c'è modo di ricreare l'eccezione come se fosse lanciata attraverso il limite del servizio, e non c'è alcun modo automatico per ottenere nulla, tranne per una SoapException sul lato client.