Si os dicen de programar un servidor de WebService, aceptad mi consejo y negados en redondo, dejad que sea otro quien acabe tirándose por la ventana. Un diminuto WebService que debería ser la cosa más sencilla del mundo se ha ido convirtiendo a lo largo de estos últimos meses en la peor pesadilla que pueda recordar desde que cogí un ordenador por primera vez.
¿ Acaso la parte de implementación de un WebService no puede usar componentes ?. No lo entiendo, mi WebService no intenta hacer absolutamente nada con los datos que recibe, ningún tratamiento ni cálculo ni nada. Quiero evitar problemas así que simplemente transfiere los datos a un procedimiento almacenado de Firebird, donde se hacen cómodamente todas las operaciones necesarias.
Pero ni así consigo que funcione. He puesto los componentes FibDatabase, FibStoredProc, FibTransaction, ... en el datamodule principal, pero cuando intento acceder a ellos en la implementación del WebService me salta un "Access Violation" (y si intento poner los componentes en un segundo DataModule, independiente, el módulo ISAPI se queda bloqueado y el ejecutable CGI informa al arrancar de que esa aplicación solo puede cargar un DataModule).
Ejemplo :
procedure TSolfaPort.AnulacioAtracada(AnyEscala: integer; NumeroEscala: integer; SequenciaAtracada: integer); var Log: TStringList; Fitxer_Log: string; begin Log := TStringList.Create; Fitxer_Log := 'C:\Logs\AnulacioAtracada_' + FormatDateTime('yyyy-mm-dd', Now) + '.log'; if FileExists(Fitxer_Log) then Log.LoadFromFile(Fitxer_Log); try Log.Append(''); Log.Append('AnyEscala: ' + IntToStr(AnyEscala)); Log.Append('NumeroEscala: ' + IntToStr(NumeroEscala)); Log.Append('SequenciaAtracada: ' + IntToStr(SequenciaAtracada)); dmPrincipal.Cn.Open; dmPrincipal.spAnulacio.ParamByName('ANY_ESCALA').Value := AnyEscala; dmPrincipal.spAnulacio.ParamByName('NUMERO_ESCALA').Value := NumeroEscala; dmPrincipal.spAnulacio.ParamByName('SEQUENCIA_ATRACADA').Value := SequenciaAtracada; dmPrincipal.spAnulacio.ExecQuery; dmPrincipal.Cn.Close; Log.Add('>>> Correctamente Exportado a las ' + FormatDateTime('HH:MM', Now)); except on E: Exception do begin Log.Add('!!! ERROR !!! : ' + E.Message); end; end; Log.SaveToFile(Fitxer_Log); Log.Free; end;
El archivo de Log me informa de que salta un error de "Access Violation", aparentemente en : dmPrincipal.Cn.Open;
¿ Alguien que tenga un poco de experiencia le puede echar una ojeada a mi código (he adjuntado el proyecto, aunque está hecho en Delphi 2010 debería funcionar igual en cualquier Delphi anterior que tenga instalada la colección FibPlus) ?.
El código es sencillísimo y no entiendo porqué no funciona (el hecho de no poder depurar un WebService, no ayuda precisamente).
NOTA: Aunque ese proyecto genera tanto el WebService como módulo ISAPI y como ejecutable CGI, en el servidor distribuyo el módulo ISAPI.
Gracias por cualquier consejo que me podáis dar.