Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ISAPI con delphi (https://www.clubdelphi.com/foros/showthread.php?t=71938)

erickahr 19-01-2011 18:21:45

ISAPI con delphi
 
Estoy tratando de hacer un sitio con páginas dinamicas, de hecho he desarrollado un pequeño ejemplo y compilado la DLL, pero resulta que no me funciona, es decir que cuando invoco desde el navegador alguna accion de las que se encuentran en la DLL, me manda el error 404, que segun tengo entendido se debe a que no se encuentra la página; este 'sitio' lo tengo sobre Windows 2003 y estoy corriendo en este el IIS 6.0 el cual tiene permitido el ISAPI.
http://avt7ya.bay.livefilestore.com/...iis.png?psid=1

He puesto la pagina html con la que ingreso en el directorio 'c:\inetpub\wwwroot\', y la dll generada en delphi2010 en la carpeta 'Scripts'

Este es el codigo de la DLL(cabe mencionar que es el ejemplo de un tuto de RD identico, solo aguna variaciones)
Código:

unit WebMain;
interface
uses
  SysUtils, Classes, HTTPApp, DBWeb, DB, IBCustomDataSet, IBDatabase, HTTPProd;
type
  TWebModule1 = class(TWebModule)
    Base: TIBDatabase;
    TT: TIBTransaction;
    Detalle: TIBDataSet;
    Maestro: TIBDataSet;
    DataSetTableProducer1: TDataSetTableProducer;
    procedure WebModule1waGuardarenlibroAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure DataSetTableProducer1FormatCell(Sender: TObject; CellRow,
      CellColumn: Integer; var BgColor: THTMLBgColor; var Align: THTMLAlign;
      var VAlign: THTMLVAlign; var CustomAttrs, CellData: string);
    procedure WebModule1waDetallemensajeAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  private
  public
  end;
var
  WebModule1: TWebModule1;
implementation
{$R *.dfm}
procedure TWebModule1.DataSetTableProducer1FormatCell(Sender: TObject; CellRow,
  CellColumn: Integer; var BgColor: THTMLBgColor; var Align: THTMLAlign;
  var VAlign: THTMLVAlign; var CustomAttrs, CellData: string);
begin
  if (CellColumn = 1) and (CellRow<>0) then
    CellData := '<A HREF="/scripts/WebServer.dll/detallemensaje?idmensaje=' +
  Maestro.FieldByName('idmensaje').AsString + '">' + CellData + '</A>';
end;
procedure TWebModule1.WebModule1waDetallemensajeAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var htmlResponse: string;
begin
  if Request.QueryFields.Values['idmensaje']<>'' then
    with Detalle do begin
      Close;
      Params.ByName('idmensaje').AsInteger :=
      StrToInt(Request.QueryFields.Values['idmensaje']);
      Open;
      htmlResponse := '<HTML><BODY><TABLE WIDTH="100%" BORDER="1">'#13;
      htmlResponse := htmlResponse + '<TR><TD COLSPAN="2" BGCOLOR="#CCCCCC"><CENTER><H2>Detalle del mensaje</H2></CENTER></TD></TR>'#13;
      htmlResponse := htmlResponse + '<TR><TD WIDTH="40%"><B>ID del mensaje:</B></TD><TD>' + FieldByName('idmensaje').AsString + '</TD></TR>'#13;
      htmlResponse := htmlResponse + '<TR><TD><B>Nombre:</B></TD><TD>' +
      FieldByName('nombre').AsString + '</TD></TR>'#13;
      htmlResponse := htmlResponse + '<TR><TD><B>Correo electr&oacute;nico:</B></TD><TD>' + FieldByName('email').AsString + '</TD></TR>'#13;
      htmlResponse := htmlResponse + '<TR><TD><B>Ciudad:</B></TD><TD>' +
      FieldByName('ciudad').AsString + '</TD></TR>'#13;
      htmlResponse := htmlResponse + '<TR><TD COLSPAN="2"><B>Mensaje:</B><BR>' +
      FieldByName('mensaje').AsString + '</TD></TR>'#13;
      htmlResponse := htmlResponse + '</TABLE></BODY></HTML>'#13;
      Close;
    end
  else htmlResponse := '<HTML><BODY><H2>Hubo un error en el id del mensaje.</H2></BODY></HTML>';
  Response.Content := htmlResponse;
end;
procedure TWebModule1.WebModule1waGuardarenlibroAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  msg: string;
begin
  try
    msg := '';
    with Maestro do begin
      Append;
      FieldByName('nombre').AsString := Request.ContentFields.Values['nombre'];
      FieldByName('email').AsString := Request.ContentFields.Values['email'];
      FieldByName('ciudad').AsString := Request.ContentFields.Values['ciudad'];
      FieldByName('mensaje').AsString := Request.ContentFields.Values['mensaje'];
      Post;
      TT.Commit;
      Maestro.Open;
    end;
    except
      on E:Exception do  begin
        TT.Rollback;
        msg := E.Message;
      end;
    end;
  if msg = '' then msg := 'Registro guardado correctamente.';
Response.Content := '<HTML><BODY><CENTER><H2>' + msg + '</H2><P><A HREF="/guardarenlibro.htm">Regresar</A></CENTER></BODY></HTML>';
end;
end.

y este el Codigo del formulario o pagina inicial en HTML

Código:

<html>
<head>
<title>Libro de visitas</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<table width="400" align="center" border="1">
<tr><td>
<h1>Libro de Visitas</h1>
<form method="post" action="/scripts/WebServer.dll/guardarenlibro" name="form1">
<p>Nombre:
<input type="text" name="nombre" size="40" maxlength="100">
</p>
<p>E-Mail:
<input type="text" name="email" size="40" maxlength="100">
</p>
<p>Ciudad:
<input type="text" name="ciudad" size="40" maxlength="40">
</p>
<p>Mensaje: <br>
<center><textarea name="mensaje" cols="40" rows="5"></textarea></center>
</p>
<p><center>
<input type="submit" name="Submit" value="Enviar">
<input type="reset" name="boton" value="Borrar campos">
<input type="button" value="Ver mensajes"
OnClick="top.location.href='/scripts/WebServer.dll/lista';">
</center></p>
</form>
</td></tr>
</table>
</body>
</html>


Dada la informacion (a ver si no se durmieron con mi explicacion):D, cuando le doy click en el boton 'Enviar' por ejemplo y me manda el codigo 404, ahora despues de tanta explicacion, mis dudas es: ¿debo hacer alguna configuracion especial en el IIS? o bien a ¿que se debe que no funcione?, ayuda porfavor!!!:o

ElKurgan 20-01-2011 07:27:52

Me parece recordar que para que funcione desde fuera tienes que tener abierto el puerto 80. ¿Has comprobado si se trata de eso?

Saludos

erickahr 20-01-2011 17:13:48

Hola ElKurgan, antes que nada, gracias por responder a mmi pregunta; si, esta abierto el puerto 80, de hecho tengo una pagina estatica HTML, y puedo accesar sin problema, cuando postee mi pregunta tenia el problema de que si ponia http://miservidor/miextension.dll me daba el cuadro para descargar la dll, en lugar de mostrar la informacion que debia. Esto lo solucione, agregando la dll en la lista de extenciones:
  • En la consola de IIS --> Click derecho sobre mi servidor web
  • Elegí propiedades --> Home Directory -->Configuration
  • Presione el boton Add, y seleccione mi dll y en el cuadro de extension le puse .dll
Con eso consegui que me devolviera la informacion en vez de pedirme descargar la dll.

Ahora el problema es que solo me muestra la accion que puse como default, me explico:

Ahora si pongo http://miservidor/miextension.dll me muestra una lista de la tiendas que tengo en mi BD (esa es la accion que tengo definida por defecto), pero si realizo una consulta (una de las demas acciones que estan definidas en mi WebModule) por ejemplo: http://miservidor/miextension/detalletienda?tienda=10 me manda la misma pagina, es decir no me genera error ni nada.

Asi esta la dll en mi servidor:
https://xcns7g.bay.livefilestore.com...dll.jpg?psid=1

Si necesitan alguna info mas, le agradezco que me digan, para que me pueda ayudar a solucionar este problema.

Igual y la bola de cristal de casimiro entra en accion, y me viene a salvar :D

klmn206 23-01-2011 05:08:43

新加的空白文章2
 
这是新加的空白文章2,可以在ubb可视化编辑器中,添加和修改文章内容。

erickahr 28-03-2011 17:28:43

Hola esta es una prueba

josejp1 20-04-2011 00:07:19

Utiliza "Vcl for the web", te va a ahorrar muchísimo trabajo y tienes muchos ejemplos disponibles (En cuanto he visto que desde tu programa tienes que preparar el código HTML de respuesta me he echado las manos a la cabeza )
Lo que te propongo te permite utilizar isapi's con Windows Server y con los Layouts (Templates ) puedes crear una página web incorporando los objetos de tu programa que quieras ( grids, edits, listbox, etc...)

rolandoj 24-04-2011 19:37:45

Posible causa y consejos
 
Hola,

Si te responde siempre con la página de default; lo más probable es que el problema no sea de ISAPI sino de el encriptamiento del camino. Digo, a menos que el URL de tú servidor lo hayas copiado mal, estás usando encriptamiento.

La lógica del encriptamiento debería ser :

http://miservidor/miextension.dll/Datosencriptados

Donde Datosencriptados debería ser una cadena que encriptara la concatenación del PathInfo con los parámetros de la llamada. Con eso localizaría al DLL sin problemas y luego, en el evento BeforeDispatch se puede atrapar la cadena enciptada y ahí desencriptar para dirigir los parámetros al PathInfo adecuado.

De esa forma, para controlar el buen funcionamiento de la encriptación, bastaría depurar el DLL poniendo un punto de ruptura en BeforeDispatch. Es de anotar que no es facil configurar y usar IIS para depuración. En su lugar yo uso Omnisecure, una vieja herramienta inadecuada para producción; pero, muy facil de usar para depurar.

Un último consejo : No mezcles los componente de Base de datos con el WebModule. Es mejor tenerlos por separado. El WebModule debería implementar solo la lógica de encriptamiento, el chequeo de permiso y la respuesat inmediata a cada requerimiento; pero, ya lo que es el valor a devolver en el Response.Content debería ser una función devuelta por un TDataModule de Datos independiente. Típicamente, uno usa mútiples TDataModules para atender los requerimientos de un DLL complejo

Suerte


La franja horaria es GMT +2. Ahora son las 09:17:08.

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