1

我正在使用 Delphi 10.4.2 和 IIS 10 编写一个 ISAPI DLL。

配置、内容、请求-响应、调试,一切正常。

但是,我无法读取请求的自定义标头。测试请求来自 Postman。

TWebModule1.WebModule1DefaultHandlerAction中,请求继承自Web.Win.IsapiHTTP.TISAPIRequest

我正在使用Web.Win.IsapiHTTP.TISAPIRequest.GetFieldByName()Embarcadero 文档中提到的方法。

我已经添加<add name="Access-Control-Allow-Origin" value="*" />  到服务器端的配置文件中。

我觉得我错过了什么。

例如,这返回空内容,但从我发送的客户端,每个 GetFieldByName 返回一个空字符串。

TWebModule1.WebModule1DefaultHandlerAction..
begin
  Response.statuscode := 200;
  response.Content := Request.GetFieldByName('ic_Something');
  Handled := true;
 end;
4

2 回答 2

2

根据ISAPI 服务器变量,您需要使用HEADER_<HeaderName>HTTP_<HeaderName>在检索自定义标头时使用:

多变的 描述
HEADER_<HeaderName>

IIS 5.1 及更早版本:此服务器变量不可用。
存储在标头 <HeaderName> 中的值。除此表中列出的标头之外的任何标头必须以“HEADER_”开头,以便 ServerVariables 集合检索其值。这对于检索自定义标头很有用。

注意:与 HTTP_<HeaderName> 不同,HEADER_<HeaderName> 中的所有字符都按原样解释。例如,如果您指定 HEADER_MY_HEADER,服务器将搜索名为 MY_HEADER 的请求标头。
HTTP_<标头名称> 存储在标头 <HeaderName> 中的值。此表中列出的标头以外的任何标头必须以“HTTP_”开头,以便 ServerVariables 集合检索其值。这对于检索自定义标头很有用。

注意:服务器将 <HeaderName> 中的任何下划线 (_) 字符解释为实际标题中的破折号。例如,如果您指定 HTTP_MY_HEADER,则服务器将搜索名为 MY-HEADER 的请求标头。

例如:

TWebModule1.WebModule1DefaultHandlerAction..
begin
  Response.statuscode := 200; 
  Response.Content := Request.GetFieldByName('HEADER_ic_Something');
  Handled := true; 
end;

更新:显然GetFieldByName()已经在HTTP_<HeaderName>找你了。但是根据上述文档,它将搜索名为的 HTTP 标头ic-Something,而HEADER_ic_Something将搜索ic_Something。因此,请使用更适合您需求的那个。

于 2021-09-01T14:30:44.773 回答
0

要从 ISAPI 中的请求中读取所有自定义标头,您必须将 ALL_RAW 指定为字段名称:

TWebModule1.WebModule1DefaultHandlerAction
var
  CustomHeaders: string;
begin
  CustomHeaders := Request.GetFieldByName('ALL_RAW');
end;
于 2021-09-01T08:49:14.690 回答