Como responder un HTTP 500 - "Internal Server Error" en un servicio web GeneXus C#.

En determinados programas expuestos como servicios web SOAP, es conveniente devolver un error 500 - Internal Server Error, para dejar bien evidente que hubo un problema serio.

En GeneXus no hay una forma nativa de devolver estos errores, por ahora al menos.

Necesitábamos devolver errores 500 cuando nos llegaba un request con formato invalido.

Lo que hicimos fue, agregar en la primera línea del procedure (*):

&SoapErrMsg = GetSOAPErrMsg()

If &SoapErrMsg  <> ''
  csharp throw new System.Web.Services.Protocols.SoapException([!&SoapErrMsg!], System.Web.Services.Protocols.SoapException.ClientFaultCode);
endif

* Esto fue probado en el Upgrade 5 de GeneXus 16. 



Comentarios

  1. Es correcto dar un 5XX para cuando el cliente te manda mal el formato?
    no seria mas correcto un 4XX?

    El 500 a mi como cliente me lleva a pensar que del lado del servidor ocurrió algo no manejado no?

    ResponderBorrar
  2. Es discutible.

    El problema es que en Genexus 16, si se usa SOAP no nativo, devuelve http 200 si esta mal formado el request y eso es un poco peligroso.

    En https://www.w3.org/TR/soap11/#_Toc478383529 dice:

    In case of a SOAP error while processing the request, the SOAP HTTP server MUST issue an HTTP 500 "Internal Server Error" response and include a SOAP message in the response containing a SOAP Fault element (see section 4.4) indicating the SOAP processing error.

    por lo que preferimos devolver un 500 en los casos que detectemos algo que este mal formado para que sea fácil detectarlos en todos los casos.

    De cualquier forma, se puede devolver un 4XX si fuera necesario con una programación parecida.

    ResponderBorrar
  3. Hola, como podemos hacer algo similar utilizando java? gracias

    ResponderBorrar
  4. Hola, como seria para un servicio REST? gracias!

    ResponderBorrar
    Respuestas
    1. En REST es mas sencillo, podes usar el objeto API y devolvés el RESTCode. Hay informacion en https://wiki.genexus.com/commwiki/servlet/wiki?50052,API%20object%20-%20GetByKey%20service%20definition%20and%20declaration
      Si seteas el RestCode setea el Http Status Code.

      Borrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.