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
相关产品推荐
相关产品推荐

