无法从TIdHTTPCommandGet过程OnCommandGet访问.js文件

时间:2014-07-11 09:07:38

标签: javascript delphi indy http-get

我正在使用主窗体上的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对象')。任何想法如何解决它。

1 个答案:

答案 0 :(得分:3)

您的代码始终返回index.html文件,与客户端请求的文档无关。因此,如果客户端收到index.html并尝试呈现它,则客户端将检测到存在对资源脚本/ script.js的引用,并向您的服务器发送HTTP GET请求。但是服务器会忽略所请求资源的名称(在RequestInfo参数中给出),再次读取index.html文件并返回其内容而不是JavaScript文件。客户期望一个有效的JavaScript文档,并接收一个HTML文档。

要解决此问题,请检查ARequestInfo.Document属性,然后返回所请求资源的内容。