exe是用Delphi7寫的,以前在Win2003的IIS下可以正常瀏覽,現在我需要在在WinServer2008下IIS7.5裝好了配置CGI 但一直報錯,請指點
uj5u.com熱心網友回復:
iis7與iis6完全不同了。。。cgi模式的isapi在iis7下怎么都不行,最終無奈改用apache跑isapi了。。。。
uj5u.com熱心網友回復:
我也是遇到這種情況,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里面想辦法。
uj5u.com熱心網友回復:
終于在 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;
uj5u.com熱心網友回復:
為了不受重裝或切換機器,使得修改被恢復,建議將CGIApp.pas拷到你的工程目錄下,并且加入到工程,這樣就不會到時又來百思不得其解。uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55080.html
標籤:網絡通信/分布式開發
