exe是用Delphi7写的,以前在Win2003的IIS下可以正常浏览,现在我需要在在WinServer2008下IIS7.5装好了配置CGI 但一直报错,请指点

解决方案 »

  1.   

    iis7与iis6完全不同了
    cgi模式的isapi在iis7下怎么都不行,最终无奈改用apache跑isapi了。
      

  2.   

    我也是遇到这种情况,6年前用Delphi7写了一个cgi作为webService,当时服务器环境是32位Windows 2003,当然IIS是6.0。现在服务器升级了,改为64位Windows 2008,IIS是7.5,结果部署过去就是不能运行,报的错误是:
    =========================================================================
    HTTP 错误 502.2 - Bad Gateway
    指定的 CGI 应用程序由于未返回完整的一组 HTTP 头而产生错误行为。它实际返回的头是“Exception EInOutError in module TestService_D7.exe at 00036FBC. I/O error 6. ”。
    =========================================================================
    我想到的解决有两种:
    1.如果有源码,就把Delphi7改成Delphi XE来编译一下。但是这个Delphi7的cgi使用了一些第三方控件的话,要考虑有相适配的版本。
    2.如果没有源码,就改用Apache来运行cgi。但我的这个webService用到了ado来连接数据库,32位服务器是没有问题的,64位服务器是找不到ado相关的dll,所以也是行不通。如果有源码,可以把ADO全部换成UniDAC控件来连接数据库,这样编译之后就可以了。不过,我听说有高手是解决过Delphi7, cgi, iis7, x64上的问题,但不知道是怎么解决的。估计是在 HTTPSoapDispatcher,HTTPSoapPascalInvoker,WSDLHTMLPublish里面想办法。
      

  3.   

    终于在 https://serverfault.com/questions/130423/run-cgi-in-iis-7-to-work-with-get-without-requiring-post-request 找到答案,将CGIApp的Run部分代码进行修改即可。
    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(ExceptObject, FOutputFileName);
      end;
    end;注释蓝色部分,添加红色部分。
    当然,我打开XE8找到相应部分,将其代码拷过来,然后编译,也是可以的。
    procedure TCGIApplication.Run;
    var
      HTTPRequest: TCGIRequest;
      HTTPResponse: TCGIResponse;
    begin
      inherited Run;
      if IsConsole then
      begin
        Rewrite(Output);
      end;
      try
        HTTPRequest := NewRequest;
        if HTTPRequest.ContentLength > 0 then
        begin
          if IsConsole then
            Reset(Input);
          // Read post data.
          HTTPRequest.ReadString(-1);  
        end;
        try
          HTTPResponse := NewResponse(HTTPRequest);
          try
            HandleRequest(HTTPRequest, HTTPResponse);
          finally
            HTTPResponse.Free;
          end;
        finally
          HTTPRequest.Free;
        end;
      except
        HandleServerException(ExceptObject, FOutputFileName);
      end;
    end;
      

  4.   

    为了不受重装或切换机器,使得修改被恢复,建议将CGIApp.pas拷到你的工程目录下,并且加入到工程,这样就不会到时又来百思不得其解。