您知道如何在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添加自定义标头)。
谢谢。
答案 0 :(得分:2)
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()
函数的指针,用于添加/修改请求标头值。