2009-08-18 20 views
9

Mam usługę internetową, w której utworzyłem niestandardowy wyjątek. Powiedzmy, że nazwa tego wyjątku to InvalidContractException.Catch Custom Exception z ASMX Web Service

Co chciałbym zrobić, jeśli wystąpi określony krok, chcę rzucić ten wyjątek. Jednak nie mogę dowiedzieć się, jak klient złapał wyjątek InvalidContractException, aby obsłużyć go poprawnie.

to jest Web Service ASP.Net napisany w języku C#

Odpowiedz

17

Nie możesz tego zrobić: Usługi

  1. sieci Błędy zrobić mydło. Wyjątki są specyficzne dla platformy.
  2. Gdy wyjątek jest nieobsługiwany w usłudze internetowej ASMX, .NET przetłumaczy go na błąd SOAP. Szczegóły wyjątku nie są serializowane.
  3. W kliencie ASMX błąd SOAP zostanie przetłumaczony na wyjątek SoapException.

Usługi sieciowe ASMX nie mają odpowiedniego wsparcia dla błędów SOAP. Nie ma sposobu, aby uzyskać wyjątek inny niż wyjątek SoapException po stronie klienta.

Kolejny powód do aktualizacji do WCF.


Jako przykład co nie można zrobić z ASMX, oto jak działa WCF. WCF umożliwia określenie, dla każdej operacji usług internetowych, które błędy mogą go zwrócić:

[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"; 
    } 
} 

WCF klient może wtedy złapać FaultException<SomeOtherFault>, na przykład. Kiedy wypróbowałem to z klientem Java, udało mu się złapać SomeOtherFault, stworzone przez IBM Rational Web Developer, aby wywodziło się z klasy Java Exception.

0

w wywołaniu klienta do usługi WCF, że rzuca winy, ty

spróbować ..

usterkę złapać jak FaultException (z YourService.FooBarFault)

koniec spróbować

Musisz zadeklarować FaultContract dla metody usługi, które mogą generować th e błąd, np.

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

Używa ASMX. Nazwał to "ASP.NET Web Services" –

+0

Ach ok .. Myślałem, że był przy użyciu WCF –

5

Jeśli Twoim celem jest wyrzucenie wyjątku, aby użytkownik mógł się zorientować, że coś poszło nie tak, wystąpił wyjątek specjalny i ma do niego specjalną obsługę, masz opcję. Trzeba po prostu polegać na poprawnej implementacji proxy klienta (w rzeczywistości jedną z opcji jest zapewnienie samego proxy klienta).

Istnieje przydatny artykuł dostępny pod numerem here o tym, jak działają SoapException.

Zasadniczo sprowadza się do kodowania szczegółów wyjątku (np. Kodu błędu) w węźle szczegółów SoapException, a następnie analizowania go po stronie klienta przed ponownym wysłaniem wyjątku.

Nie można odtworzyć wyjątku tak, jakby został on rzucony przez granicę usługi, i nie ma żadnego automatycznego sposobu na uzyskanie czegoś poza wyjątkiem SoapException po stronie klienta.

Powiązane problemy