You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用WebBroker(TIdHTTPWebBrokerBridge)+TWebModule服务HTML引用的文件

问题核心原因

你返回CSS文件的HTTP响应没有设置正确的Content-Type响应头,浏览器无法识别返回内容是层叠样式表,因此不会将其应用到页面渲染。
你直接访问/data/style.css时浏览器会把内容当纯文本展示,所以看起来内容正常,但HTML引用时浏览器会严格校验MIME类型,类型不匹配就直接忽略样式。

其他可能的诱因

  • 缓存问题:浏览器可能缓存了之前错误MIME类型的响应,清空缓存或者强制刷新(Ctrl+F5)可以排查。
  • 权限问题:TFileStream读取文件时如果权限不足会返回空内容,但你已经确认内容可正常读取,该概率较低。

修复方案

修改BeforeDispatch事件代码,在返回CSS文件时补充正确的Content-Type头,同时可以补全其他静态文件的MIME类型适配,修改后的代码如下:

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; 
  Response: TWebResponse; var Handled: Boolean);
var
  LocalPath: String;
  Ext: string;
begin
  if Request.PathInfo.StartsWith('/data/') then
  begin
    LocalPath := DataPath + StringReplace(Request.PathInfo, '/', '\', [rfReplaceAll]);
    if FileExists(LocalPath) then
    begin
      Response.ContentStream := TFileStream.Create(LocalPath, fmShareDenyWrite);
      // 新增:根据文件后缀设置正确的MIME类型
      Ext := LowerCase(ExtractFileExt(LocalPath));
      if Ext = '.css' then
        Response.ContentType := 'text/css; charset=utf-8'
      else if Ext = '.js' then
        Response.ContentType := 'application/javascript; charset=utf-8'
      else if Ext = '.png' then
        Response.ContentType := 'image/png'
      else if Ext = '.jpg' then
        Response.ContentType := 'image/jpeg'
      else
        Response.ContentType := 'application/octet-stream';
      Assert(Response.ContentStream.Size > 0);
    end
    else
    begin
      // 补充文件不存在的404处理
      Response.StatusCode := 404;
      Response.Content := '404 Not Found';
    end;
    Handled := True;
  end;
end;

修改后重启服务,清空浏览器缓存再访问即可生效。

内容的提问来源于stack exchange,提问作者m227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 02:24:03