2009-03-26 15 views
6

Ahora estoy jugando con WebServices, usando .NET framework (archivos .asmx, no WCF). Me pregunto cuál es la mejor práctica para decirle al usuario que ha ocurrido algún tipo de error comercial en la llamada al método.Mejores prácticas para el manejo de errores en un servicio web

Mi pequeño caso de prueba:

He sondas de medición que deben registrarse en un servidor central. Cada sonda debe tener una dirección física diferente. Para inscribirse, deben llamar al (a través de un servicio web):

[WebMethod] 
public void RegisterReadingStation(out Guid sessionId, Int64 physicalAddress) 

Ahora, la firma no está escrito en piedra - en realidad, eso es lo que estoy tratando de averiguar. :) Necesito de alguna manera alertar a la sonda si está tratando de registrarse usando una dirección física que ya está tomada.

La forma en que lo veo, me dieron unas cuantas posibilidades:

  • lanzar una SoapException que contiene la información. Sin embargo, un mensaje de cadena :: no es realmente tan fácil de hacer verificaciones programáticas.
  • Utilice algún tipo de valor-clase como parámetro de retorno (o incluso más simple, una enumeración). Si hago esto, ¿supongo que tuve que serializar/deserializar manualmente la clase en el servidor/cliente?

¿Alguna idea de esto?

Respuesta

1

Creo que el consenso común sería usar un código de retorno personalizado (entero). Siempre que el servicio documente cuáles son los posibles códigos de retorno, esto debería ser factible.

+0

Eek, de vuelta a los C-días. El problema con este enfoque es que no es muy flexible. No puede agregar mensajes de error personalizados como un stacktrace o un mensaje o ... Puedo ver que esta sería la salida fácil y multi-compatible. – cwap

+0

Tengo una apreciación adquirida por los servicios web que se apartan del lado de la simplicidad. –

+0

Aunque esta no es la respuesta más votada, la aceptaré. Me gusta el aspecto "Webservices debería ser simple de usar", así que esto es lo que me apegaré por ahora :) – cwap

5

Devuelvo una clase pequeña llamada ResultSet de cada WebMethod, que contiene un int errorcode y un error de cadena de mensajes.

Esto le da una verificación fácil de error/éxito, y algunos detalles si las cosas van mal.

Si el WebMethod necesita devolver datos, heredaré de ResultSet para dar un ResultSet específico para incluir los datos también.

+0

Sí, eso era si me dirigía también :) – cwap

+0

Pero qué hacer cuando se supone que la función del servicio web devuelve un objeto como employeeData cuando todo va bien y debe devolver un mensaje de error cuando hay un error. Cómo devolver dos diferentes objetos de la misma función en diferentes escenarios? –

+0

Lo que hice fue crear una nueva clase que se llama EmployeeDataResultSet, que hereda de ResultSet. Luego agregué una propiedad a EmployeeDataResultSet que es la clase EmployeeData. Básicamente, encapsula los datos de su Empleado en su ResultSet. – Moose

Cuestiones relacionadas