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.
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.
Es correcto dar un 5XX para cuando el cliente te manda mal el formato?
ResponderBorrarno 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?
Es discutible.
ResponderBorrarEl 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.
Hola, como podemos hacer algo similar utilizando java? gracias
ResponderBorrarHola, como seria para un servicio REST? gracias!
ResponderBorrarEn 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
BorrarSi seteas el RestCode setea el Http Status Code.