在IIS 7中运行CGI以使用GET而无需POST请求

我试图从现有的Windows 2003服务器(IIS 6.0)中迁移旧的CGI应用程序,它工作得很好到IIS 7.0的新的Windows 2008服务器,我们得到以下问题:

设置模块处理程序和所有东西后,我发现我只能访问CGI应用程序(rdbweb.exe)文件,如果我通过POST请求(表单提交从另一个页面)调用它。

如果我只是尝试input文件的URL(发出GET请求),我得到以下错误:

HTTP错误502.2 – 错误的网关

指定的CGI应用程序由于没有返回一组完整的HTTP头而被误操作。 它返回的标题是“模块rdbweb.exe在00039B44.I / O错误6”中的exceptionEInOutError。

这是我们的客户之一的一个非常古老的应用程序。 当我们试图打电话给供应商时,他们说我们需要支付约3000美元的年度支持费才能开始谈论它。 当然,我试图避免这一点!

注意:

  • 如果我们创build一个提交给“rdbweb.exe”的普通HTML表单,我们就可以使CGI正常工作。 我们不能使用这个作为解决方法,因为应用程序中的一些页面链接到“rdbweb.exe”与普通链接不forms提交。
  • 如果我们运行“rdbweb.exe”。 从控制台(命令提示符)窗口而不是IIS,我们得到正常的HTML,我们通常会期望,没有问题。

我们已经尝试了以下内容:

  • 确保在IIS中映射到“rdbweb.exe”的CGI模块具有启用的所有权限(读,写,执行),并且所有动词都不仅允许特定的动词,还尝试允许GET,明确地POST。
  • 确保应用程序布尔具有“启用32位应用程序”设置为true。 确保网站运行一个帐户,具有“rdbweb.exe”。文件和整个网站(尽pipe我们知道它“读”,“执行”应该是足够的)的完整权限。
  • 确保“ISAPI和CGI限制”的机器范围IIS设置具有“rdbweb.exe”.allowed的完整path。
  • 将模块从CGI更改为快速CGI,也无法正常工作
  • 确保我们有最新的Windows更新(对于IIS6,我们发现知识库文章指出需要IIS6热修复的错误,但IIS7没有发现类似的错误)。

现在唯一剩下的可能性就是下面的Microsoft知识库文章: http : //support.microsoft.com/kb/145661 – 这是关于:

CGI错误:指定的CGI应用程序由于没有返回一组完整的HTTP头而被误操作。 它返回的标题是:

文章提出了以下解决scheme:

修改CGI应用程序头输出的源代码。 以下是一个正确的标题的例子:

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

不幸的是,我们没有来源尝试这个, 我不知道这是否是我们正在处理的问题

你能帮我解决这个问题吗? 有没有办法让应用程序工作,而无需POST请求? 请注意,在旧的IIS6服务器上应用程序工作得很好,我找不到任何特殊的IISconfiguration,我可能想在IIS7上尝试其相当的。

简而言之:它可能是一个delphiCGI应用程序编译与D2007上次更新(11.0.2902.10471)之前的Delphi版本。 如果是这种情况,你需要源代码和Delphi安装,并重新编译应用程序。 另外,你应该问他们只是使用最近的Delphi版本重新编译应用程序。

(来自http://forums.iis.net/t/1100323.aspx?PageIndex=2

我们发现导致我们的CGI在IIS 7上没有响应的问题。我们实际上把原因缩小到用Delphi编写的所有CGI应用程序(至less到2005版本)的基类中的一行代码。 这行代码在TCGIApplication的Run方法中,并简单地重置标准input。 在IIS 6和之前,这行执行没有问题,但在IIS 7上引发了一个exception,导致CGI应用程序崩溃,因此不响应请求。 我们仍在调查评论这条线的副作用,但这是我们目前的解决scheme。 通过删除这一行,我们的CGI应用程序现在正在IIS 7上正确执行。

原作者:史蒂文

我们有一个Delphi 5 CGI应用程序,在IIS 7上遇到同样的问题。我们的解决scheme类似于上面发布的Steven,但是,我们并没有完全注释掉上面提到的线路marius。 当我这样做的时候,我看到任何Request.ContentString语句都会在应用程序中返回一个空string。 我们的解决scheme是在底部附近实现本文提出的代码修复。 为了您的参考,这里是一个代码与我们的CGIApp.pas副本随着变化剪辑。

 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; 

CGI供应商确认该应用程序与IIS 7.0不兼容,他们将在未来的版本中支持该应用程序。

我认为这表明唯一的修复是Microsoft知识库文章中提到的代码更改。

我有这个问题(CGI GET与Delphi生成CGI不工作),我也想保持一个。CGI扩展到我的CGI而不是.exe(这吓倒用户!)。 IIS 7.5似乎不允许CGI的扩展名为.exe或.dll以外的其他扩展名。

这里是一个涉及PHP(!)的超级整洁工作:

基本上你会得到PHP来调用你的CGI并回显结果。

在你的IISconfiguration中,将* .cgi映射到php,就像你将* .php一样。 用以下PHP代码直接调用CGI文件而不是直接调用.cgi文件:

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

用你原来的Delphi CGIreplace'C:… path your cgi … // … delphicgi.exe'。

你有它! 您的用户不应该注意到任何区别。 显然,通过PHP的性能打击。 但至less你不需要重build你的CGI,你可以有一个.cgi的扩展名!