2010-10-01 12 views
8

Mam klasyczny serwis WWW asp.net (asmx) i metodę sieciową. Muszę rzucić niestandardowy wyjątek dla niektórych przypadków w mojej metodzie internetowej i muszę złapać ten wyjątek niestandardowy, gdy wołam metodę usługi sieciowej.Złapanie niestandardowego wyjątku zgłoszonego przez WebMethod na ASP.NET WebService

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public HelloWorldOutput HelloWorld(HelloWorldInput input) 
    { 
     try 
     { 
      // My Code 
      return new HelloWorldOutput(); 
     } 
     catch (Exception ex) 
     { 
      throw new HelloWorldException("Hello World Exception", ex); 
     } 
    } 
} 

wejściowe, wyjściowe i wyjątków klas jako próbka:

public class HelloWorldInput { } 
public class HelloWorldOutput { }  

[Serializable] 
public class HelloWorldException : Exception 
{ 
    public HelloWorldException() { } 
    public HelloWorldException(string message) : base(message) { } 
    public HelloWorldException(string message, Exception inner) 
     : base(message, inner) { } 
    protected HelloWorldException(
     System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) { } 
} 

Na stronie klienta, muszę:

public static void Main() 
{ 
    WebService service = new WebService(); 
    try 
    { 
     service.HelloWorld(new HelloWorldInput()); 
    } 
    catch (HelloWorldException ex) 
    { 
     // Do sth with HelloWorldException 
    } 
    catch (Exception ex) 
    { 
     // Do sth with Exception 
    } 
} 

Niestety, nie mogę tego zrobić, bo po dodaniu odwołanie do usługi WWW na kliencie, mam klasy usługi, klasy wejścia i wyjścia, ale nie mam niestandardowej klasy wyjątków.

także inny problem jest to, że mam też problemy z szeregowania klasę Exception (ze względu na własności Exception.Data implementuje interfejsu IDictionary)

Czy istnieje sposób, aby zrobić to na swój sposób, czy jestem w zupełnie w niewłaściwy sposób, czy jest coś, czego mi brakuje na temat podstaw usług internetowych?

Dzięki.

Odpowiedz

11

ASP.NET Web Service może rzucić każdy rodzaj wyjątku: SoapException , HelloWorldException lub soever. Jednak wyjątek jest przekształcany do postaci szeregowej w element błędu SOAP i niezależnie od typu wyjątku zgłaszanego w usłudze wyjątek jest przekształcany w wyjątek SoapException podczas deserializacji. W związku z tym nie jest możliwe złapanie wyjątku HelloWorldException z moim blokiem catch w moim pytaniu, nawet jeśli wdrażam wyjątek HelloWorldException na kliencie.

W przypadku klienta ASP.NET jedynym sposobem jest wychwycenie wyjątku jako wyjątku SoapException i obsłużenie go przez jego właściwość Actor lub SoapFaultSubCode.

Ja w zasadzie rozwiązać mój problem jak poniżej:

Web Service:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public HelloWorldOutput HelloWorld(HelloWorldInput input) 
    { 
     try 
     { 
      // My Code 
      return new HelloWorldOutput(); 
     } 
     catch (Exception ex) 
     { 
      throw new SoapException("Hello World Exception", 
       SoapException.ServerFaultCode, "HelloWorld", ex); 
     } 
    } 
} 

Klient:

public static void Main() 
{ 
    WebService service = new WebService(); 
    try 
    { 
     service.HelloWorld(new HelloWorldInput()); 
    } 
    catch (SoapException ex) 
    { 
     if(ex.Actor == "HelloWorld") 
      // Do sth with HelloWorldException 
    } 
    catch (Exception ex) 
    { 
     // Do sth with Exception 
    } 
} 

wraz z dokumentem, który Bryce Fischer napisał w swojej odpowiedzi; te dokumenty msdn zawierają również pomocne informacje na temat wyrzucania i obsługi wyjątków usług internetowych.

How to: Throw Exceptions from a Web Service Created Using ASP.NET

How to: Handle Exceptions Thrown by a Web Service Method

+0

Musisz ustawić tryb customErrors = "RemoteOnly" lub "On" w swojej sieci.config – eddy

4

This może być pomocne. Wygląda na to, że dostaniesz wyjątek SoapException, ale możesz sprawdzić szczegóły, aby określić, czy jest to twoja klasa, czy nie.

marginesie, aby mieć dostęp do „HelloWorldException”, można pociągnąć go do zespołu oddzielnym i wdrażać że na kliencie ...

+0

Link został udostępniony był bardzo pomocny Bryce. Dzięki. Pomoże mi to w zrozumieniu zachowania wyjątków usług internetowych. Jednak wdrożenie klasy wyjątków do klienta będzie dla mnie późnym wyborem. Pomyślę o tym przez chwilę. Wielkie dzięki. –

Powiązane problemy