Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-01-2011
Avatar de erickahr
erickahr erickahr is offline
Miembro
 
Registrado: feb 2010
Posts: 94
Poder: 15
erickahr Va por buen camino
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), 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!!!
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes

Última edición por erickahr fecha: 19-01-2011 a las 18:25:07. Razón: El primer bloque es codigo delphi, pero como tiene tags HTML, se me hizo un desastre en la pregunta, asi que lo puse en CODE
Responder Con Cita
  #2  
Antiguo 20-01-2011
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.233
Poder: 20
ElKurgan Va camino a la fama
Me parece recordar que para que funcione desde fuera tienes que tener abierto el puerto 80. ¿Has comprobado si se trata de eso?

Saludos
Responder Con Cita
  #3  
Antiguo 20-01-2011
Avatar de erickahr
erickahr erickahr is offline
Miembro
 
Registrado: feb 2010
Posts: 94
Poder: 15
erickahr Va por buen camino
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
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes

Última edición por erickahr fecha: 20-01-2011 a las 17:17:35.
Responder Con Cita
  #4  
Antiguo 23-01-2011
klmn206 klmn206 is offline
Baneado
NULL
 
Registrado: ene 2011
Posts: 1
Poder: 0
klmn206 Va por buen camino
Arrow 新加的空白文章2

这是新加的空白文章2,可以在ubb可视化编辑器中,添加和修改文章内容。
Responder Con Cita
  #5  
Antiguo 28-03-2011
Avatar de erickahr
erickahr erickahr is offline
Miembro
 
Registrado: feb 2010
Posts: 94
Poder: 15
erickahr Va por buen camino
Hola esta es una prueba
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes
Responder Con Cita
  #6  
Antiguo 20-04-2011
josejp1 josejp1 is offline
Miembro
 
Registrado: oct 2008
Posts: 42
Poder: 0
josejp1 Va por buen camino
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...)
Responder Con Cita
  #7  
Antiguo 24-04-2011
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ShareMem es requerida en ISAPI ? rolandoj Internet 0 17-03-2008 21:09:30
Filtro Isapi con C# Melcv .NET 0 26-06-2006 11:57:28
ISAPI e Interbase!!! acertij022 Internet 2 02-07-2004 21:44:12
Apache e ISAPI de Delphi anitra_cattivo Internet 10 22-05-2004 18:21:07
Modo seguro en cgi o isapi ingacg Internet 0 25-10-2003 02:08:14


La franja horaria es GMT +2. Ahora son las 23:32:54.


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
Copyright 1996-2007 Club Delphi