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
。因此,请使用更适合您需要的那个。
我正在使用 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
。因此,请使用更适合您需要的那个。