【问题标题】:Add a Custom Header on a TISAPIRequest (Delphi 10.1 Datasnap Server)在 TISAPIRequest 上添加自定义标头(Delphi 10.1 Datasnap Server)
【发布时间】:2016-08-11 16:08:39
【问题描述】:

您知道如何在 TISAPIRequest 上手动添加自定义标头吗?

此类(或最通用的 TWebRequest)不公开 RawHeaders 属性以允许在需要时添加新的自定义标头。

PS:当我的 WebRequest 是 TIdHTTPAppRequest(Datasnap 独立服务器)时,我有一个肮脏的解决方案,因为那时我可以创建一个 Helper 类来访问其私有 FRequestInfo 属性,并从那里获得对 RawHeaders 的访问权限,我可用于添加新标题。但是我只使用独立服务器进行开发和测试,生产环境必须运行在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 添加自定义标头)?。

谢谢。

【问题讨论】:

    标签: http delphi datasnap


    【解决方案1】:

    TISAPIRequest 有一个公共的ECB 属性,它返回一个指向表示底层请求数据的ISAPI EXTENSION_CONTROL_BLOCK 结构的指针。但是,ECB 不允许您以任何方式更改请求标头,只能从中读取值。不过,您可以通过 ECB 设置自定义响应标头。

    我能找到在 ISAPI 中添加/修改自定义请求标头值的唯一方法是编写 ISAPI Filter DLL,这超出了 TISAPIRequest 处理的范围。在 DLL 导出的 HttpFilterProc() 函数中,SF_NOTIFY_PREPROC_HEADERS 通知提供了一个 HTTP_FILTER_PREPROC_HEADERS 结构,其中包含指向 AddHeader()SetHeader() 函数的指针,用于添加/修改请求标头值。

    【讨论】:

    • 谢谢你,Remy,我打算写那个 ISAPI 过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2019-02-19
    • 2012-05-17
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多