我正在使用主窗体上的TIdHTTPServer和IdHTTPServer过程的CommandGet制作VCL窗体应用程序:
procedure TForm6.IdHTTPServerPaymentsCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
path: string;
content: TFileStream;
begin
AResponseInfo.CharSet := 'UTF-8';
path := GetCurrentDir.Remove(GetCurrentDir.Length - 11) + 'index.html'; // Length('Win32\Debug') = 11
if pos('profile&userName=', ARequestInfo.UnparsedParams) > 0 then
begin
content := TFileStream.Create(path, fmOpenReadWrite);
try
AResponseInfo.ContentStream := content;
finally
content.Free;
end;
end;
end;
index.html包含:
<html>
<head>
<title>Profile</title>
<script type="text/javascript" src="scripts/script.js"></script>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
</head>
<body onload="sampleAlert()"><!-- sample function from script.js -->
<!-- Page content -->
</body>
</html>
问题是当我在浏览器中打开index.html文件(没有启动应用程序)时,页面工作正常,但是当我启动VCL应用程序时,我无法访问script.js(当使用IE9进行测试时:'的值属性'sampleAlert'为null或undefined,而不是Function对象')。任何想法如何解决它。
答案 0 :(得分:3)
您的代码始终返回index.html文件,与客户端请求的文档无关。因此,如果客户端收到index.html并尝试呈现它,则客户端将检测到存在对资源脚本/ script.js的引用,并向您的服务器发送HTTP GET请求。但是服务器会忽略所请求资源的名称(在RequestInfo参数中给出),再次读取index.html文件并返回其内容而不是JavaScript文件。客户期望一个有效的JavaScript文档,并接收一个HTML文档。
要解决此问题,请检查ARequestInfo.Document
属性,然后返回所请求资源的内容。