关于 WinServer2008下IIS7.5配置CGI的问题 exe是用Delphi7写的,以前在Win2003的IIS下可以正常浏览,现在我需要在在WinServer2008下IIS7.5装好了配置CGI 但一直报错,请指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 iis7与iis6完全不同了cgi模式的isapi在iis7下怎么都不行,最终无奈改用apache跑isapi了。 我也是遇到这种情况,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里面想办法。 终于在 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; 为了不受重装或切换机器,使得修改被恢复,建议将CGIApp.pas拷到你的工程目录下,并且加入到工程,这样就不会到时又来百思不得其解。 读配置文件的时候为什么会出现,读出的小节是一些系统配置文件? 新手求教 ComboBoxs指针一个有趣的问题,各位达人如何见解? 怎么获得数据集的第n个记录? 通过CET-6,散分(可惜级别有限,一次只能散100分) canvas什么时候能用? 一般数据库的商业程序的启动都包括这几步. 简单问题,求教:Oracle 8.0.5中ParamByName的问题? BDE无法连接SQL2000? 神啊!救救我吧!--关于TLISTVIEW的问题.急急急(高分) 卧槽,终于记得密码了,人老了,不管用了,兄弟们,可安好? delphi xe10 安装 android SDK 问题
cgi模式的isapi在iis7下怎么都不行,最终无奈改用apache跑isapi了。
=========================================================================
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里面想办法。
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;