Execute CGI no IIS 7 para trabalhar com GET sem a necessidade de solicitação POST

2

Estou tentando migrar um aplicativo CGI antigo de um servidor existente do Windows 2003 (IIS 6.0), onde ele funciona muito bem para um novo servidor Windows 2008 com o IIS 7.0, onde estamos tendo o seguinte problema:

Depois de configurar o manipulador de módulo e tudo, acho que só posso acessar o arquivo de aplicativo CGI (rdbweb.exe) se estou chamando-o via solicitação POST (envio de formulário de outra página).

Se eu tentar digitar a URL do arquivo (emitindo uma solicitação GET), recebo o seguinte erro:

HTTP Error 502.2 - Bad Gateway

The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are "Exception EInOutError in module rdbweb.exe at 00039B44. I/O error 6. ".

Esta é uma aplicação muito antiga para um dos nossos clientes. Quando tentamos ligar para o fornecedor, eles disseram que precisávamos pagar uma taxa de suporte anual de $ 3000 para começar a conversa sobre o assunto. Claro que estou tentando evitar isso!

Observe que:

  • Se criarmos um formulário HTML normal que envia para "rdbweb.exe", obtemos o CGI funcionando normalmente. Não podemos usar isso como solução alternativa, porque algumas páginas no link do aplicativo para "rdbweb.exe" com link normal não são enviadas.
  • Se executarmos "rdbweb.exe". a partir de uma janela do Console (Prompt de Comando), não do IIS, obtemos o HTML normal que normalmente esperamos, sem problemas.

Nós tentamos o seguinte:

  • Garantir o módulo CGI mapeado para "rdbweb.exe" .no IIS tem todas as permissões (leitura, gravação, execução) ativadas e também todos os verbos são permitidos não apenas específicos, também tentou permitir GET, POST explicitamente.
  • Garantir que o bool de aplicativo tenha "ativar aplicativos de 32 bits" definido como verdadeiro. Garantir que o site seja executado com uma conta que tenha permissões completas no arquivo "rdbweb.exe" .file e todo (apesar de sabermos que "ler", "executar" deve ser suficiente).
  • Garantir a configuração ampla do IIS do computador para "Restrições ISAPI e CGI" tem o caminho completo para "rdbweb.exe".
  • Alterando o módulo de CGI para Fast CGI, não funcionando também
  • Certificando-nos de que temos as atualizações mais recentes do Windows (para o IIS6, encontramos artigos da base de conhecimento informando bugs que exigem hot fixes para o IIS6, mas nada semelhante foi encontrado para o IIS7).

Agora, a única possibilidade restante que instigamos é o seguinte artigo da Base de conhecimento da Microsoft: link - que é sobre:

CGI Error: The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

o artigo sugere a seguinte solução:

Modify the source code for the CGI application header output. The following is an example of a correct header:

 print "HTTP/1.0 200 OK\n";  
 print "Content-Type: text/html\n\n\n";

Infelizmente, não temos a fonte para tentar isso, e não tenho certeza se esse é o problema que estamos tendo .

Você pode me ajudar com esse problema? Existe uma maneira de fazer o aplicativo funcionar sem exigir a solicitação POST? Observe que no servidor antigo do IIS6 o aplicativo está funcionando bem, e não consegui encontrar nenhuma configuração especial do IIS que eu possa querer testar como equivalente no IIS7.

    
por Meligy 08.04.2010 / 07:56

4 respostas

3

Logo: pode ser um aplicativo Delphi CGI compilado com uma versão do Delphi anterior à última atualização do D2007 (11.0.2902.10471). Se for o caso, você precisa das fontes e de uma instalação do Delphi e recompilar o aplicativo. Alternativamente, você deve pedir-lhes apenas para recompilar o aplicativo usando uma versão recente do Delphi.

(de link )

Descobrimos que o problema que fazia com que nosso CGI não respondesse no IIS 7. Na verdade, reduzimos o motivo a uma linha de código na classe base de todos os aplicativos CGI escritos em Delphi (pelo menos até a versão 2005). Esta linha de código está no método Run do TCGIApplication e simplesmente redefine a entrada padrão. No IIS 6 e anterior, essa linha é executada sem nenhum problema, mas no IIS 7 é gerada uma exceção que faz com que o aplicativo CGI trave e, portanto, não responda a solicitações. Ainda estamos investigando os efeitos colaterais de comentar essa linha, mas essa é a nossa solução atual. Ao remover essa linha, nossos aplicativos CGI agora estão sendo executados corretamente no IIS 7.

Autor original: Steven

    
por 25.05.2010 / 12:29
3

Temos um aplicativo Delphi 5 CGI que experimentou o mesmo problema no IIS 7. Nossa solução foi semelhante à que o Steven publicou acima, no entanto, não comentamos completamente a linha mencionada acima. Quando o fiz, vi que qualquer instrução Request.ContentString traria de volta uma string vazia no aplicativo. Nossa solução foi implementar a correção de código sugerida no artigo na parte inferior. Para sua referência, aqui está um código recortado de nossa cópia do CGIApp.pas com a mudança.

procedure TCGIApplication.Run;
var
  HTTPRequest: TCGIRequest;
  HTTPResponse: TCGIResponse;
begin
  inherited Run;
  if IsConsole then
  begin
    Rewrite(Output);
    //Win 7/2008 IIS7
    //Reset(Input);
    {$i-} {!!IIS7}
    Reset(Input);
    if IOResult <>0 then ;
    {$i+}
  end;
  try
    HTTPRequest := NewRequest;
    try
      HTTPResponse := NewResponse(HTTPRequest);
      try
        HandleRequest(HTTPRequest, HTTPResponse);
      finally
        HTTPResponse.Free;
      end;
    finally
      HTTPRequest.Free;
    end;
  except
    HandleServerException(Exception(ExceptObject), FOutputFileName);
  end;
end;
    
por 30.07.2012 / 04:50
0

O fornecedor CGI confirmou que o aplicativo não é compatível com o IIS 7.0 e eles o suportarão em versões futuras.

Acho que isso sugere que a única correção é a alteração de código mencionada no artigo da base de conhecimento da Microsoft.

    
por 08.04.2010 / 11:54
0

Eu tive este problema (CGI GET não trabalhando com CGI gerado pelo Delphi) e eu também queria manter uma extensão .cgi para o meu CGI ao invés de .exe (o que assusta os usuários!). O IIS 7.5 não parece permitir que CGI tenha uma extensão diferente de .exe ou .dll.

Aqui está um ótimo trabalho envolvendo o PHP (!):

Basicamente, você irá obter o PHP para chamar seu CGI e ecoar os resultados.

Na sua configuração do IIS, mapeie * .cgi para php como você faria * .php. Em vez de chamar seu CGI, chame diretamente um arquivo .cgi com o seguinte código PHP:

<?php

putenv('QUERY_STRING=' . $_SERVER['QUERY_STRING']);
echo system('C:... path your cgi...//...delphicgi.exe');

?>

Substitua 'C: ... caminho seu cgi ... // ... delphicgi.exe' com seu Delphi CGI original.

Lá você tem! Seus usuários não devem notar nenhuma diferença. Obviamente, há o impacto no desempenho de passar pelo PHP. Mas pelo menos você não precisou reconstruir seu CGI e pode ter uma extensão .cgi!

    
por 08.02.2013 / 17:23