Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   DataSnap REST Error HTTP/1.1 500 (https://www.clubdelphi.com/foros/showthread.php?t=89205)

blaiselaborde 15-10-2015 16:18:04

DataSnap REST Error HTTP/1.1 500
 
1 Archivos Adjunto(s)
Buenos días . . .

Tengo un Servidor DataSnap REST para atender solicitudes por HTTP con WebMod y atendido por un DSRESTDispacher + DSAuthenticationManager + Otros componentes básicos . . .

Recibe solicitudes desde las oficinas centrales por la Red interna y desde Móbiles y Tablets por Internet . . .

Fue creado con el asistente y lo he pulido hasta conseguir que funcione bien y sin mayores inconvenientes para un número de solicitudes HTTP bastante bajo de momento, según mi concepto (Unas 10 por minuto) . . .

El tema es que una de las API's funciona bien y sin problema si se hace una sóla solicitud, pero también tengo que enviar una Lista Diaria de Solicitudes a dicha API, las cuales se hacen desde un ciclo "While" de manera secuencial y sin descanso, tardándose en promedio 6 segundos en procesar cada una de un total de 1000 que deben enviarse . . .

Comienza trabajando bien, pero cuando entra alguna solicitud al Servidor, de otra aplicación ó de la misma, el Servidor DataSnap se bloquea y salta un error en el cliente . . . Se le dá aceptar al mensaje de Error y el proceso sigue, pero con dificultad, afectando a todas las API's, y se nota que el Servidor está pillado, hasta que se detiene por completo y hay que resetearlo.

La única solución que he encontrado para ésto, es ejecutar el Servidor como segunda opción y arrancarlo con un número de Puerto diferente, dejando dos ejecuciones del Servidor, la segunda que trabaje exclusivamente para este caso en particular.

El error que he conseguido ver es: HTTP/1.1 500 Internal Server Error

El código en el cliente es:

Código Delphi [-]
Procedure TForm.acSendExecute(Sender: TObject);
Var i: Integer;
Begin
  i := 1;
  While i <= 1000 do
    Try
      Try
        FHTTP := TIdHTTP.Create(Self);
        FHTTP.Request.ContentType     := 'text/xml; charset=utf-8';
        FHTTP.Request.ContentEncoding := 'utf-8';
        FHTTP.HTTPOptions             := [hoForceEncodeParams];
        FHTTP.Request.CharSet         := 'utf-8';

        FHTTP.Request.Authentication          := TIdBasicAuthentication.Create;
        FHTTP.Request.Authentication.Username := 'BLAISE';
        FHTTP.Request.Authentication.Password := 'PASCAL';
        FHTTP.Get('http://localhost:8080/datasnap/rest/TServerMethods1/fWGenerate/"'  + Trim(Data[i]) + '"');
      Except
        On E: EIdHTTPProtocolException do
          Begin
            Application.MessageBox(PChar('Error --> ' + Trim(Data[i]) + ' - ' + E.Message), 'Attention', MB_ICONERROR);
            Dec(i);
          End; // On
      End; // Try
    Finally
      TIdBasicAuthentication.Free;
      FHTTP.Free;
      Inc(i);
    End; // Try - While
End; // Proc

Estoy usando Delphi XE7, tiene acceso a la BBDD en Oracle 11g usando el componente DOA (Direct Oracle Access).
Gracias.

jhonny 16-10-2015 17:11:55

Me late que el problema debes verlo es en el server como tal, es como si el método fWGenerate no liberara memoria, conexiones o algo por el estilo.

jhonny 07-11-2015 15:42:39

¿Pudiste solucionar este problema, al depurar el server cuando recreas este error qué error te sale en el server?

blaiselaborde 09-11-2015 14:41:29

Hola Johnny, buenas tardes . . .

Muchas gracias por darme tu opinión al respecto y sí, todo indica que los tiros van por donde tú comentas, pero aún no he podido descubrir el fallo.

He modificado el Registro de Windows para que libere los puertos virtuales lo más pronto posible y he aumentado el número de puertos virtuales. Además he aumentado la memoria del Servidor y he reducido el acceso a la base de datos unificando las llamadas en un solo Script, además de evitar el acceso a los datos usando una Base de Datos Intermedia, ahora lo hago directamente; también he optimizando el uso del Stack para que libere todo lo que toma de élla al final de cada Invocación.

En fín, el Servidor está muy fino y se nota una mejoría sustancial con respecto al comienzo; lo que permite que los usuarios accedan al método fWGenerate sin mayores problemas. Sin embargo, no he podido conseguir que sirva indiscriminadamente. Es decir, que si le envío una tanda secuencial de llamadas al Método (no pasan de 50), como la del proceso que mencioné anteriormente, termina bloqueándose y es el error que me dá . . .

Sigo con la búsqueda y con Ensayo y Error hasta que encuentre el problema . . .

Muchas gracias por tu ayuda!!! . . .

jhonny 09-11-2015 15:31:03

A mí me han pasado cosas parecidas y me he encontrado con que estoy liberando memoria donde no debería ser liberada... incluso a veces en métodos que se ejecutan despues de donde se eleva la excepción.

Y digo parecidas, porque he notado que en los servers sucede que en ocasiones uno cree que el problema es que no se está liberando algo y el asunto es lo contrario, siendo una situación donde se está liberando más de lo normal ocasioneando un AV típico.


La franja horaria es GMT +2. Ahora son las 16:46:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi