添加自定义页眉一个TISAPIRequest(德尔福10.1 DataSnap服务器)上(Add a

2019-09-29 18:20发布

你知道如何手动上TISAPIRequest添加自定义标题?

这个类(或最通用的TWebRequest)不公开RawHeaders属性,以允许在需要的时候增加新的自定义页眉。

PS:我有,当我的WebRequest是TIdHTTPAppRequest(的DataSnap独立服务器)一个肮脏的解决方案,因为这样我可以创建一个辅助类来访问其私人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)当WebRequest的是TISAPIRequest而不是THTTPAppRequest?

谢谢。

Answer 1:

TISAPIRequest具有公共ECB属性,它返回一个指向ISAPI EXTENSION_CONTROL_BLOCK表示底层请求的数据结构。 然而, ECB不允许你改变请求头以任何方式,只读从他们的值。 您可以通过设置自定义响应头ECB ,虽然。

我能找到在ISAPI添加/修改自定义请求头的值的唯一方法是写一个ISAPI滤波器DLL ,它是范围之外TISAPIRequest处理。 内部的DLL的导出HttpFilterProc()函数中, SF_NOTIFY_PREPROC_HEADERS通知提供HTTP_FILTER_PREPROC_HEADERS包含指针结构AddHeader()SetHeader()函数用于添加/修改请求标头值。



文章来源: Add a Custom Header on a TISAPIRequest (Delphi 10.1 Datasnap Server)