Array
(
)

Dúvida WEbServices

Caduengenheiro
   - 22 fev 2006

pessoal... to seguindo o artigo do guinter pauli a respeito de datasnap e soap baseado na última clubedelphi

eu criei a aplicação servidor e quando coloquei o servidor soap, escolhi o apache 1.x shared module(DLL). Não utilizei o IIS por razoes de trabalho, por aqui todos usam somente apache. Pois bem, compilei a aplicação servidor e gerou um arquivo .dll que coloquei dentro do htdocs do apache. Mas quando chamo no browser pelo localhost este arquivo .dll, apenas pede para salvar o arquivo sem exibir seu conteúdo.

Bem, sei que tenho q configurar o arquivo httpd.conf, mas nem tenho idéia de como configurá-lo para ler dlls do soap...



alguem pode ajudar?

grato


Thomaz_prg
   - 23 fev 2006


Citação:
Pois bem, compilei a aplicação servidor e gerou um arquivo .dll que coloquei dentro do htdocs do apache. Mas quando chamo no browser pelo localhost este arquivo .dll, apenas pede para salvar o arquivo sem exibir seu conteúdo.

O que ocorre é que para o apache, a execução de módulos é feita por arquivos com extensão SO e não DLL, e devem ser colocados na pasta modules do apache. Você até pode colocar em outra pasta, como na htdocs, mas precisa ser explicado no arquivo httpd.conf (como você mesmo já havia dito).


Citação:
Bem, sei que tenho q configurar o arquivo httpd.conf, mas nem tenho idéia de como configurá-lo para ler dlls do soap...


coloque no arquivo o código abaixo:

#Código


LoadModule ModSeuArquivo modules/SeuArquivo.so
<Location /linkWeb>
SetHandler mod_SeuArquivo-handler
</Location>


onde,

SeuArquivo é o nome do arquivo gerado (atente para o fato de ser case sensitive).

modSeuArquivo é o valor que está definido dentro do arquivo do projeto no delphi (está bem explícito, com o nome do projeto seguido de _module)

mod_SeuArquivo é o nome do seu arquivo, sem a extensão SO.

linkWeb é o link no qual você deseja que seja chamado seu módulo apache. Diferente do IIS, que você chama o módulo especificando o nome da DLL, no apache você dá um ´apelido´ para o módulo. No código citado acima, para que o módulo fosse carregado no browser bastaria digitar http://localhost/linkWeb.

Note que, indiquei modules como pasta para os módulos, mas você pode trocar para a pasta que quiser. Outro fator interessante é que, você pode ter um arquivo DLL, mas deve especificá-lo.


Caduengenheiro
   - 24 fev 2006

cara.. deu certinho.. valeu... configurei o httpd.conf chamando o arquivo .dll mesmo .. assim:


LoadModule Project2_module modules/SoapServerClubeDelphi.dll
<Location /linkWeb>
SetHandler SoapServerClubeDelphi-handler
</Location>


ai chamo http://localhost/linkWeb

deu certinho.. brigadao


ps: nao mudei o nome do alias linkweb para evitar a fadiga (Jaiminho o carteiro)

aauhahuauhauhuauhuha

brigadao


Khaoz
   - 16 ago 2006

Boa tarde.
Estou dando um UP nessa thread pois nesse exato momento iniciei o exemplo do Guinther Pauli (Revista ClubeDelphi - Ano 5 - Edição 70) utilizando o Delphi 7 Enterprise e com uma pequena modificação no que vai ser o servidor de web services: Estou criando um ´Shared Module´ para o Apache 2.x.x.

Os passos:
Crie o servidor de aplicação:
File > New > Other > Web Services > SOAP Server Application (Selecionei a opção Apache 2.x Shared Module (DLL)

Após isso criei o SOAP Server Data Module:
File > New > Other > Web Services > SOAP Server Data Module

No SOAP Server Data Module adicionei os componentes:
TADOConnection (meu banco é SQL Server 2000)
TADODataSet
TDataSetProvider

Salvei, compilei, copiei a dll gerada para dentro da pasta modules do apache, adicionei as linhas informadas nesse post e restartei o apache.... NADA :(
O Apache não inicia mais depois de adicionar essas linhas.
Procurando pela internet, encontrei algumas dicas interessantes e fiz as modificações, até mesmo para manter o padrão apache, adicionando duas diretivas de compilação: Uma troca a extensão de .dll para .so e a outra adiciona o prefixo mod_ ao arquivo so (dll) gerado.
Também alterei a linha onde é feito a exportação do módulo, mudando o nome do módulo de Project1_module para SOAPServer_module. Também alterei o Output Directory do projeto para sempre compilar a so (dll) diretamente no diretório:

Citação:

C:\Arquivos de programas\Apache Software Foundation\Apache2.2\modules

Fiz as alterações necessárias no httpd.conf, mas ainda assim NADA :(
Estou rodando a última versão do apache (2.2.3) no windows, localmente para testes, pois é apenas um pequeno exemplo para ver a funcionalidade.

Segue abaixo o código da minha unit de projeto (.dpr)

#Código


library SOAPServer;

uses
WebBroker,
ApacheTwoApp,
UWebModule in ´UWebModule.pas´ {ServerWebModule: TWebModule},
USoapServerDataModule in ´USoapServerDataModule.pas´ {SoapServerDataModule: TSoapDataModule};

{$R *.res}

{$E so} //change binary file extension from .dll to .so
{$LIBPREFIX ´mod_´} // add a prefix

exports
apache_module name ´SOAPServer_module´;

begin
Application.Initialize;
Application.CreateForm(TServerWebModule, ServerWebModule);
Application.Run;
end.


e aqui as linhas que adicionei em meu httpd.conf

#Código

LoadModule SOAPServer_module modules/mod_SOAPServer.so

#<IfModule SOAPServer_module>
<Location /delphi>
SetHandler mod_SOAPServer-handler
</Location>
#</IfModule>


Onde eu posso estar errando meu amigos, se alguém poder me dizer ficarei muito grato.


Khaoz
   - 16 ago 2006

Boa tarde.
Estou dando um UP nessa thread pois nesse exato momento iniciei o exemplo do Guinther Pauli (Revista ClubeDelphi - Ano 5 - Edição 70) utilizando o Delphi 7 Enterprise e com uma pequena modificação no que vai ser o servidor de web services: Estou criando um ´Shared Module´ para o Apache 2.x.x.

Os passos:
Crie o servidor de aplicação:
File > New > Other > Web Services > SOAP Server Application (Selecionei a opção Apache 2.x Shared Module (DLL)

Após isso criei o SOAP Server Data Module:
File > New > Other > Web Services > SOAP Server Data Module

No SOAP Server Data Module adicionei os componentes:
TADOConnection (meu banco é SQL Server 2000)
TADODataSet
TDataSetProvider

Salvei, compilei, copiei a dll gerada para dentro da pasta modules do apache, adicionei as linhas informadas nesse post e restartei o apache.... NADA :(
O Apache não inicia mais depois de adicionar essas linhas.
Procurando pela internet, encontrei algumas dicas interessantes e fiz as modificações, até mesmo para manter o padrão apache, adicionando duas diretivas de compilação: Uma troca a extensão de .dll para .so e a outra adiciona o prefixo mod_ ao arquivo so (dll) gerado.
Também alterei a linha onde é feito a exportação do módulo, mudando o nome do módulo de Project1_module para SOAPServer_module. Também alterei o Output Directory do projeto para sempre compilar a so (dll) diretamente no diretório:

Citação:

C:\Arquivos de programas\Apache Software Foundation\Apache2.2\modules

Fiz as alterações necessárias no httpd.conf, mas ainda assim NADA :(
Estou rodando a última versão do apache (2.2.3) no windows, localmente para testes, pois é apenas um pequeno exemplo para ver a funcionalidade.

Segue abaixo o código da minha unit de projeto (.dpr)

#Código


library SOAPServer;

uses
WebBroker,
ApacheTwoApp,
UWebModule in ´UWebModule.pas´ {ServerWebModule: TWebModule},
USoapServerDataModule in ´USoapServerDataModule.pas´ {SoapServerDataModule: TSoapDataModule};

{$R *.res}

{$E so} //change binary file extension from .dll to .so
{$LIBPREFIX ´mod_´} // add a prefix

exports
apache_module name ´SOAPServer_module´;

begin
Application.Initialize;
Application.CreateForm(TServerWebModule, ServerWebModule);
Application.Run;
end.


e aqui as linhas que adicionei em meu httpd.conf

#Código

LoadModule SOAPServer_module modules/mod_SOAPServer.so

#<IfModule SOAPServer_module>
<Location /delphi>
SetHandler mod_SOAPServer-handler
</Location>
#</IfModule>


Onde eu posso estar errando meu amigos, se alguém poder me dizer ficarei muito grato.


Khaoz
   - 16 ago 2006

Boa tarde.
Estou dando um UP nessa thread pois nesse exato momento iniciei o exemplo do Guinther Pauli (Revista ClubeDelphi - Ano 5 - Edição 70) utilizando o Delphi 7 Enterprise e com uma pequena modificação no que vai ser o servidor de web services: Estou criando um ´Shared Module´ para o Apache 2.x.x.

Os passos:
Crie o servidor de aplicação:
File > New > Other > Web Services > SOAP Server Application (Selecionei a opção Apache 2.x Shared Module (DLL)

Após isso criei o SOAP Server Data Module:
File > New > Other > Web Services > SOAP Server Data Module

No SOAP Server Data Module adicionei os componentes:
TADOConnection (meu banco é SQL Server 2000)
TADODataSet
TDataSetProvider

Salvei, compilei, copiei a dll gerada para dentro da pasta modules do apache, adicionei as linhas informadas nesse post e restartei o apache.... NADA :(
O Apache não inicia mais depois de adicionar essas linhas.
Procurando pela internet, encontrei algumas dicas interessantes e fiz as modificações, até mesmo para manter o padrão apache, adicionando duas diretivas de compilação: Uma troca a extensão de .dll para .so e a outra adiciona o prefixo mod_ ao arquivo so (dll) gerado.
Também alterei a linha onde é feito a exportação do módulo, mudando o nome do módulo de Project1_module para SOAPServer_module. Também alterei o Output Directory do projeto para sempre compilar a so (dll) diretamente no diretório:

Citação:

C:\Arquivos de programas\Apache Software Foundation\Apache2.2\modules

Fiz as alterações necessárias no httpd.conf, mas ainda assim NADA :(
Estou rodando a última versão do apache (2.2.3) no windows, localmente para testes, pois é apenas um pequeno exemplo para ver a funcionalidade.

Segue abaixo o código da minha unit de projeto (.dpr)

#Código


library SOAPServer;

uses
WebBroker,
ApacheTwoApp,
UWebModule in ´UWebModule.pas´ {ServerWebModule: TWebModule},
USoapServerDataModule in ´USoapServerDataModule.pas´ {SoapServerDataModule: TSoapDataModule};

{$R *.res}

{$E so} //change binary file extension from .dll to .so
{$LIBPREFIX ´mod_´} // add a prefix

exports
apache_module name ´SOAPServer_module´;

begin
Application.Initialize;
Application.CreateForm(TServerWebModule, ServerWebModule);
Application.Run;
end.


e aqui as linhas que adicionei em meu httpd.conf

#Código

LoadModule SOAPServer_module modules/mod_SOAPServer.so

#<IfModule SOAPServer_module>
<Location /delphi>
SetHandler mod_SOAPServer-handler
</Location>
#</IfModule>


Onde eu posso estar errando meu amigos, se alguém poder me dizer ficarei muito grato.


Khaoz
   - 16 ago 2006

Desculpem o post triplo, esse forum esta ultra-pesado e eu achei que não estava respondendo. Fica a sugestão de colocar um botão para excluir um post/editar um post, pois não achei o mesmo.


Khaoz
   - 16 ago 2006

Bom, aparentemente descobri o possível problema.
Parece que para fazer o delphi funcionar com o Apache 2.2.3 é necessário fazer uma alteração na unit HTTPD2.pas alterando o valor de algumas constantes (e talvez até a implementação de alguns métodos).
O problema é que achei essas alterações apenas para compatibilidade com o apache 2.0.40 - 2.0.55 e não sei de onde esses valores foram tirados (ainda).
Aqui vai o link (http://www.drbob42.com/delphi7/apache2040.htm) com uma explicação detalhada, pois além dessas alterações você deve recompilar outras duas units que dependem da HTTPD2.
Por hora, criei um novo servidor do tipo ´CGI Stand-alone executable´, larguei dentro do meu cgi-bin e ta tudo blz.[/url]


Khaoz
   - 16 ago 2006

E logo após meu último post, achei onde estão localizadas as informações:
dentro da pasta include do apache, existe um arquivo chamado

ap_mmn.h

Que contém as informações que o arquivo HTTPD2.pas necessita.

Quanto a reimplementação dos métodos, bom fica para um próximo post :D