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

Delphi开发ISAPI DLL无法读取Postman请求自定义头如何解决?

问题原因及解决步骤

你遇到的是IIS+ISAPI处理自定义请求头的常见规则限制,按以下步骤排查即可:

1. 自定义请求头命名规则问题(90%概率是这个原因)

IIS底层的HTTP.sys驱动默认会直接丢弃名称包含下划线的自定义请求头,避免和CGI环境变量命名冲突。你当前用的ic_Something头包含下划线,会被IIS直接拦截,根本不会传到ISAPI层。

  • 最优解决:把自定义头的下划线换成中横线,比如改为ic-Something,符合HTTP头命名规范,无需额外修改系统配置。
  • 若必须保留下划线:需要修改系统注册表关闭拦截规则:
    打开注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters,新增DWORD类型的DisableStrictRFCCompliance项,值设为1,修改后执行net stop http && net start http重启HTTP服务,再重启IIS生效。

2. ISAPI请求头获取规则问题

TISAPIRequest.GetFieldByName方法读取自定义请求头时,不能直接传原头名,ISAPI会自动对所有请求头做以下转换后存储:

  • 所有字母转为大写
  • 头名中的中横线-转换为下划线_
  • 统一添加HTTP_前缀

比如你发送的头是ic-Something,需要用以下代码读取:

TWebModule1.WebModule1DefaultHandlerAction..
begin
  Response.statuscode := 200;
  // 按转换后的规则传头名
  response.Content := Request.GetFieldByName('HTTP_IC_SOMETHING');
  Handled := true;
end;

3. CORS跨域配置补充

你已经配置了跨域允许来源,还需要补充允许自定义请求头的配置,否则跨域请求的自定义头会被CORS规则拦截,在web.config的customHeaders节点下新增以下配置:

<add name="Access-Control-Allow-Headers" value="ic-Something, Content-Type, *" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />

如果是预检OPTIONS请求,建议直接在代码里返回200状态,避免ISAPI默认处理拦截:

if Request.Method = 'OPTIONS' then
begin
  Response.StatusCode := 200;
  Handled := True;
  Exit;
end;

4. 调试排查方法

如果以上步骤都处理后还是有问题,可以先枚举所有收到的请求头,确认头是否已经传到ISAPI层:

var
  i: Integer;
  Headers: TStringList;
begin
  Headers := TStringList.Create;
  try
    for i := 0 to Request.GetFieldNames.Count - 1 do
    begin
      Headers.Add(Request.GetFieldNames[i] + '=' + Request.GetFieldByName(Request.GetFieldNames[i]));
    end;
    // 输出所有头排查
    Response.Content := Headers.Text;
  finally
    Headers.Free;
  end;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:36:01