はじめまして。
Windows 2000 Pro SP4 + Delphi 6 Enterpriseという環境で、
TWebModuleを用いてCGIアプリを作っています。
WebサーバーがWindows 2000であれば、IIS5でもApacheでも
正常に動作するのですが、WebサーバーをWindows 2003 Serverにすると、
CGI Error
The specified CGI application misbehaved by not
returning a complete set of HTTP headers.
になってしまいます。(IIS6、502エラー。)
Response.ContentとWritelnのどちらで出力してもエラーになります。
また、TWebModuleを使わずに単純なコンソールアプリだとエラーになりません。
更に、Delphi 2005体験版でコンパイルするとエラーにはならないことも判りました。
つまり、Delphi 6のTWebModuleがWindows 2003 Serverではエラーになるようです。
Formから送られてきたname=valueを自前でデコードするということや、
予算の都合上Delphi 2005を購入するということは避けたいので、
Delphi 6のTWebModuleを使ってもCGIエラーを回避できる手段や、
TWebModuleの代替になるものをご存知の方がいましたら、教えて頂きたいです。
よろしくお願いします。
Delphi6も、Windows2003Serverもないので未確認ですが。
正しくヘッダが設定されていないのかもしれませんね。
横取り丸
http://hide.maruo.co.jp/software/ydm.html
InetSpy
http://hide.maruo.co.jp/software/inetspy.html
こういったツールを使って、どのようなリクエストが発生しているか確認してみてください。
にしのさん、返事ありがとうございます。
HttpObserverというソフトを使っているので、
それで取得したリクエストとレスポンスが以下です。
使っているCGIアプリはDelphi6のデモをコンパイルしたものです。
Windows Server 2003
***************************************************************
----------クライアントからのリクエスト内容----------
GET http://svr2003/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-powerpoint,
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2003/cgi-bin/
Accept-Language: ja
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: svr2003
----------サーバへ送信したリクエスト内容----------
GET http://svr2003/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-powerpoint,
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2003/cgi-bin/
Accept-Language: ja
Host: svr2003
Connection: none
----------サーバからのレスポンス内容----------
HTTP/1.1 502 Bad Gateway
Content-Length: 232
Content-Type: text/html
Server: Microsoft-IIS/6.0
Date: Wed, 09 Mar 2005 00:24:11 GMT
Connection: close
<html><head><title>Error</title></head>
<body><head><title>Error in CGI Application</title></head>
<body><h1>CGI Error</h1>
The specified CGI application misbehaved by not returning
a complete set of HTTP headers.</body></body></html>
***************************************************************
Windows 2000 Sever
***************************************************************
----------クライアントからのリクエスト内容----------
GET http://svr2000/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-powerpoint,
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2000/cgi-bin/
Accept-Language: ja
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: svr2000
----------サーバへ送信したリクエスト内容----------
GET http://svr2000/cgi-bin/WebRequestCGI.exe HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-powerpoint,
application/vnd.ms-excel, application/msword, */*
Referer: http://svr2000/cgi-bin/
Accept-Language: ja
Host: svr2000
Connection: none
----------サーバからのレスポンス内容----------
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 09 Mar 2005 00:27:56 GMT
Content-Type: text/html
Content-Length: 146
Content:
Method = GET<BR>
URL = <BR>
User Agent = <BR>
Cookie = <BR>
From = <BR>
Remote Address = 192.168.0.2<BR>
Remote Host = 192.168.0.2<BR>
***************************************************************
Delphi6のUpdatePack2とRTLのアップデート3を当てて、
再び同じ物をコンパイルして試したところ、
Internal Server Error 500になりました・・・。
----------サーバからのレスポンス内容----------
HTTP/1.1 500 モジュール 'ntdll.dll' のアドレス 77F2831D で
アドレス 004047C5 に対する書き込み違反がおきました。
Content-Length: 240
Content-Type: text/html
Server: Microsoft-IIS/6.0
Content:
Date: Wed, 09 Mar 2005 01:49:47 GMT
Connection: close
<html><title>Internal Server Error 500</title>
<h1>Internal Server Error 500</h1><hr>
Exception: EAccessViolation<br>
Message: モジュール 'ntdll.dll' のアドレス 77F2831D で
アドレス 004047C5 に対する書き込み違反がおきました。<br></html>
ソースがシンプルで、TWebModuleのソースがプロジェクトに含まれていないのであれば、Delphiのバグですかね。
こちらには環境がないので試せません。
CGI実行形式でなく、NSAPIやISAPIのDLL形式にしてみるとか。
他に対処法が思いつきません。
http://onigiri.s3.xrea.com:8080/delphi/index.php?%5B%5BApache2.0.40%B0%CA%B9%DF%A4%D8%A4%CE%C2%D0%B1%FE%CA%FD%CB%A1%5D%5D
Web系 よく知らないんですけど みかけたのでお知らせします
Ver7でしたら Apacheが どうのこうのってかいてありますよ
Ver6では どうかは わかりません
CGI実行形式は、あくまでも実行ファイルですので、今回の件とは別のようです。
余談となりますが、CGI実行形式の動作は、EXEの動作と同じです。
実行時に、環境変数QUERY_STRINGに、GETで渡されたパラメータが格納されます。
POSTの場合は、環境変数CONTENT_LENGTHに格納された長さのパラメータが、標準コンソールを通して渡されます。
これらを処理すれば、TWebModuleを使わずともCGI実行形式のファイルは作ることができるのですが、
> Formから送られてきたname=valueを自前でデコードするということや、
> 予算の都合上Delphi 2005を購入するということは避けたいので、
ということでしたので。
簡単なフィールドの抽出だけでしたら、渡されたパラメータを&で区切り、さらに=で区切って名前と値に分け、名前と値のURLエンコードを戻すだけです。
ファイルの送信などの場合は、もうちょっと面倒です。
pppiさん、にしのさん、ありがとうございます。
2003上にDelphi6インストールしてコンパイルしてみたりも
してみたのですがやはり中々上手くいきません。。。
自前でデコード処理書く方が早い気もしてきたので
その方向でいこうと思います。
この問題に関係ないか知れませんがD6のソースが不足しているところがあり
unit CGIApp;の
procedure DoneApplication;
begin
try
Application.Free;
Application := nil;
except
on E:Exception do
if Assigned(HandleShutdownException) then
{HandleShutdownExceptionこれが不足本当はunit WebBrokerに
インプリメントされているはずが去れていない;
begin
Application := nil; // Application of no use at this point so clear it
Classes.ApplicationHandleException := nil;
HandleShutdownException(E);
end;
end;
end;
D7のunit WebBrokerにはインプリメントされています。ボーランドはどのように
コンパイルしたか不思議です、このような不足はD6では多々あります、
D7、2005のソースがあればそちらのソースを見ると不足のソースが見つかる場合があります、
ちなみにCorbaはD7、2005を見ないとソースは解読できません。
マッコさん、ありがとうございます。
D6ってちょっとダメなんですね。。。
上記参考にさせて頂いて試してみます。
D7もD2005も体験版しかないですが、
ソースが見れそうなら覗いてみます。
ツイート | ![]() |