在 TISAPIRequest 上添加自定义 Header(Delphi 10.1 Datasnap 服务器)
Add a Custom Header on a TISAPIRequest (Delphi 10.1 Datasnap Server)
您知道如何在 TISAPIRequest 上手动添加自定义 header 吗?
此 class(或最通用的 TWebRequest)不公开 RawHeaders 属性 以允许在需要时添加新的自定义 Headers。
PS:当我的 WebRequest 是 TIdHTTPAppRequest(Datasnap 独立服务器)时,我有一个肮脏的解决方案,因为这样我就可以创建一个 Helper Class 来访问它的私有 FRequestInfo 属性,然后从那里可以访问 RawHeaders,我可以用它来添加新的 header。但是我只使用独立服务器进行开发和测试,生产环境必须运行在IIS服务器上
TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest
public
function GetRequestInfo: TIdEntityHeaderInfo;
end;
implementation
function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo;
begin
Result := FRequestInfo;
end;
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var Token: string;
begin
Response.SetCustomHeader('Access-Control-Allow-Origin','*');
Token := Request.Query;
if Copy(Token, 1, 10) = 'dssession=' then begin
if Request is TIdHTTPAppRequest then begin
TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token);
end;
end;
if FServerFunctionInvokerAction <> nil then
FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;
当 WebRequest 是 TISAPIRequest 而不是 THTTPAppRequest 时,可以编写类似的代码来获得相同的结果(向您的 WebRequest 添加自定义 header)?
谢谢。
TISAPIRequest
has a public ECB
property, which returns a pointer to the ISAPI EXTENSION_CONTROL_BLOCK
表示底层请求数据的结构。但是,ECB
不允许您以任何方式更改请求 header,只能从中读取值。不过,您可以通过 ECB
设置自定义响应 header。
我能在 ISAPI 中找到 add/modify 自定义请求 header 值的唯一方法是为 adding/modifying 请求 header 值编写一个 ISAPI Filter DLL, which is outside the scope of TISAPIRequest
handling. Inside the DLL's exported HttpFilterProc()
function, the SF_NOTIFY_PREPROC_HEADERS
notification provides an HTTP_FILTER_PREPROC_HEADERS
structure that contains pointers to AddHeader()
and SetHeader()
函数.
您知道如何在 TISAPIRequest 上手动添加自定义 header 吗?
此 class(或最通用的 TWebRequest)不公开 RawHeaders 属性 以允许在需要时添加新的自定义 Headers。
PS:当我的 WebRequest 是 TIdHTTPAppRequest(Datasnap 独立服务器)时,我有一个肮脏的解决方案,因为这样我就可以创建一个 Helper Class 来访问它的私有 FRequestInfo 属性,然后从那里可以访问 RawHeaders,我可以用它来添加新的 header。但是我只使用独立服务器进行开发和测试,生产环境必须运行在IIS服务器上
TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest
public
function GetRequestInfo: TIdEntityHeaderInfo;
end;
implementation
function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo;
begin
Result := FRequestInfo;
end;
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var Token: string;
begin
Response.SetCustomHeader('Access-Control-Allow-Origin','*');
Token := Request.Query;
if Copy(Token, 1, 10) = 'dssession=' then begin
if Request is TIdHTTPAppRequest then begin
TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token);
end;
end;
if FServerFunctionInvokerAction <> nil then
FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;
当 WebRequest 是 TISAPIRequest 而不是 THTTPAppRequest 时,可以编写类似的代码来获得相同的结果(向您的 WebRequest 添加自定义 header)?
谢谢。
TISAPIRequest
has a public ECB
property, which returns a pointer to the ISAPI EXTENSION_CONTROL_BLOCK
表示底层请求数据的结构。但是,ECB
不允许您以任何方式更改请求 header,只能从中读取值。不过,您可以通过 ECB
设置自定义响应 header。
我能在 ISAPI 中找到 add/modify 自定义请求 header 值的唯一方法是为 adding/modifying 请求 header 值编写一个 ISAPI Filter DLL, which is outside the scope of TISAPIRequest
handling. Inside the DLL's exported HttpFilterProc()
function, the SF_NOTIFY_PREPROC_HEADERS
notification provides an HTTP_FILTER_PREPROC_HEADERS
structure that contains pointers to AddHeader()
and SetHeader()
函数.