古いCGIアプリケーションを、正常に動作する既存のWindows 2003サーバー(IIS 6.0)からIIS 7.0)の新しいWindows2008サーバーに移行しようとしています。問題:
モジュールハンドラーとすべてを設定した後、CGIアプリケーション(rdbweb.exe)ファイルにアクセスできるのは、POSTリクエスト(別のページからのフォーム送信))を介して呼び出した場合のみです。 。
ファイルのURLを入力しようとすると(GETリクエストを発行)、次のエラーが発生します。
HTTPエラー502.2-ゲートウェイが正しくありません
指定されたCGIアプリケーションは、HTTPヘッダーの完全なセットを返さないために誤動作しました。返されたヘッダーは、「モジュールrdbweb.exeの0000003B44での例外EInOutError。I/ Oエラー6」です。
これは、クライアントの1人にとって非常に古いアプリケーションです。私たちがベンダーに電話をかけようとしたとき、彼らはそれについての話を始めるために私たちが〜3000ドルの年間サポート料金を支払う必要があると言いました。もちろん、私はそれを避けようとしています!
ご了承ください:
私たちは以下を試しました:
現在、私たちが提起した唯一の残りの可能性は、次のマイクロソフトサポート技術情報の記事です。 http://support.Microsoft.com/kb/145661 -これについては次のとおりです。
CGIエラー:指定されたCGIアプリケーションは、HTTPヘッダーの完全なセットを返さないために誤動作しました。返されたヘッダーは次のとおりです。
この記事では、次の解決策を提案しています。
CGIアプリケーションヘッダー出力のソースコードを変更します。以下は、正しいヘッダーの例です。
print "HTTP/1.0 200 OK\n"; print "Content-Type: text/html\n\n\n";
残念ながら、これを試すためのソースがありません。とにかく、これが私たちが抱えている問題であるかどうかはわかりません。
この問題について私を助けてくれませんか? POSTリクエストを必要とせずにアプリケーションを機能させる方法はありますか?古いIIS6サーバーでは、アプリケーションは正常に機能しており、特別なIIS IIS7で同等のものを試してみたい構成。
間もなく:D2007の最終更新(11.0.2902.10471)より前のDelphiバージョンでコンパイルされたDelphiCGIアプリケーションである可能性があります。その場合は、ソースとDelphiのインストールが必要であり、アプリケーションを再コンパイルします。または、最新のDelphiバージョンを使用してアプリを再コンパイルするように依頼する必要があります。
( http://forums.iis.net/t/1100323.aspx?PageIndex=2 から)
CGIがIIS 7で応答しない原因となっている問題を発見しました。実際には、Delphiで記述されたすべてのCGIアプリケーションの基本クラスのコード行に理由を絞り込みました(少なくともこのコード行はTCGIApplicationのRunメソッドにあり、標準入力をリセットするだけです。IIS 6以前では、この行は問題なく実行されますが、IIS 7は例外を発生させ、CGIアプリケーションがクラッシュするため、リクエストに応答しません。この行をコメントアウトすることの副作用を調査中ですが、これが現在の解決策です。この行を削除することにより、CGIアプリケーションはIIS 7で正しく実行されています。
原作者:スティーブン
IIS 7で同じ問題が発生したDelphi5 CGIアプリケーションがあります。私たちのソリューションは、上記のStevenが投稿したものと同様でしたが、mariusが上記で言及した行を完全にコメントアウトしていません。 。私が行ったとき、Request.ContentStringステートメントがアプリケーションに空の文字列を返すことを確認しました。私たちの解決策は、下部にある この記事 で提案されたコード修正を実装することでした。これは、変更を加えた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で機能しない)、. exeではなく.cgi拡張子をCGIに残したかった(ユーザーを怖がらせる!)。 IIS 7.5では、CGIに.exeまたは.dll以外の拡張子を付けることができないようです。
これはPHP(!)を含む非常に巧妙な回避策です:
基本的に、PHPを使用してCGIを呼び出し、結果をエコーバックします。
IIS構成で、*。phpと同じように* .cgiをphpにマップします。 CGIを呼び出す代わりに、次のPHPコードを使用して.cgiファイルを直接呼び出します。
<?php
putenv('QUERY_STRING=' . $_SERVER['QUERY_STRING']);
echo system('C:... path your cgi...//...delphicgi.exe');
?>
'C:... path your cgi ... // ... delphicgi.exe'を元のDelphiCGIに置き換えます。
あります!ユーザーは違いに気付かないはずです。明らかに、PHPを経由することによるパフォーマンスへの影響があります。ただし、少なくともCGIを再構築する必要はなく、.cgi拡張子を付けることができます。