2011-02-15 13 views
6

me escribió el siguiente servicio:La captura de un SoapException lanzada por un servicio web

namespace WebService1 
{ 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    public class Service1 : System.Web.Services.WebService 
    { 
     [WebMethod] 
     public string Test(string str) 
     { 
      if (string.IsNullOrEmpty(str)) 
       throw new SoapException("message", SoapException.ClientFaultCode); 
      else 
       return str; 
     } 
    } 
} 

Y una aplicación básica para probarlo (un botón de llamada al método Test el evento de clic):

private void button1_Click(object sender, EventArgs e) 
{ 
    ServiceReference1.Service1SoapClient ws = new WindowsFormsApplication1.ServiceReference1.Service1SoapClient(); 

    try 
    { 
     ws.Test(""); 
    } 
    catch (SoapException ex) 
    { 
     //I never go here 
    } 
    catch (FaultException ex) 
    { 
     //always go there 
    } 
    catch (Exception ex) 
    { 

    } 
} 

I me gustaría atrapar el SoapException lanzado por mi WebService, pero siempre voy al FaultException catch bloque a get that as message:

System.Web.Services.Protocols.SoapException: Mensaje de en WebService1.Service1.Test (String str) en [...] WebService1 \ WebService1 \ Service1.asmx.cs: Línea 25

Cómo podría Cojo un SoapException real, y no un FaultException? ¿Hay algo que extraño en el servicio web?

Respuesta

7

Creo que el principal "problema" es que está utilizando una referencia de servicio WCF que se conecta a un servicio web ASP.NET (.asmx).

La forma "más fácil" de manejar esto probablemente sea utilizar una referencia web en lugar de una referencia de servicio WCF en el cliente. Para ello, seleccione el botón "Avanzado" en la parte inferior del cuadro de diálogo Agregar referencia de servicio, y luego Agregar referencia web en la parte inferior de esa pantalla. Creo que el uso de una Referencia web debería darle una SoapException.

La forma correcta (si desea seguir el consejo de Microsofts) sería publicar un servicio WCF en lugar de un servicio .asmx. Sin embargo, este es otro capítulo completo.

+1

-1: no es necesario usar tecnología antigua en el cliente solo porque se usa tecnología antigua en el servidor. –

+4

Cierto, ciertamente no es necesario. Sin embargo, mezclar WCF y ASMX es una forma segura de meterse en un montón de problemas. ¿Tuviste una mejor solución? Si es así, estoy seguro de que Sharpac estaría interesado en escucharlo, y yo también ... – CodingInsomnia

+0

Gracias CodingInsomnia that's works! Finalmente atrapo una SoapException. – Sharpac

5

Cuando un servicio ASMX arroja un SoapException, .NET devuelve un mensaje de error de SOAP.

A SOAP La falla se devuelve a una referencia de servicio como una excepción de tipo FaultException. Entonces nunca verás un SoapException.

Cuestiones relacionadas