ISAPI DLL 中的读取请求 headers

Read request headers in ISAPI DLL

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

配置、内容、request-response、调试,一切正常。

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

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

我正在使用 Web.Win.IsapiHTTP.TISAPIRequest.GetFieldByName() 方法,如 Embarcadero 文档中所述。

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

我觉得我错过了什么。

例如,这个returns的内容是空的,但是从我发送的client-side中,每个GetFieldByName returns都是一个空字符串。

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

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

TWebModule1.WebModule1DefaultHandlerAction
var
  CustomHeaders: string;
begin
  CustomHeaders := Request.GetFieldByName('ALL_RAW');
end;

根据 ISAPI Server Variables,您需要在检索自定义 header:

时使用 HEADER_<HeaderName>HTTP_<HeaderName>
Variable Description
HEADER_<HeaderName>

IIS 5.1 and earlier: This server variable is not available.
The value stored in the header <HeaderName>. Any header other than those listed in this table must be preceded by "HEADER_" in order for the ServerVariables collection to retrieve its value. This is useful for retrieving custom headers.

Note: Unlike HTTP_<HeaderName>, all characters in HEADER_<HeaderName> are interpreted as-is. For example, if you specify HEADER_MY_HEADER, the server searches for a request header named MY_HEADER.
HTTP_<HeaderName> The value stored in the header <HeaderName>. Any header other than those listed in this table must be preceded by "HTTP_" in order for the ServerVariables collection to retrieve its value. This is useful for retrieving custom headers.

Note: The server interprets any underscore (_) characters in <HeaderName> as dashes in the actual header. For example, if you specify HTTP_MY_HEADER, the server searches for a request header named MY-HEADER.

例如:

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

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