在 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() 函数.