如何使用IHTTPNegotiate向请求添加额外的标头?我添加了接口,但是函数BeginningTransaction & OnResponse
从未被调用。
TNameSpaceHandler = class(TComObject, IInternetProtocol, IHttpNegotiate)
...
function BeginningTransaction(szURL, szHeaders: LPCWSTR; dwReserved: DWORD;
out szAdditionalHeaders: LPWSTR): HResult; stdcall;
function OnResponse(dwResponseCode: DWORD; szResponseHeaders, szRequestHeaders: LPCWSTR;
out szAdditionalRequestHeaders: LPWSTR): HResult; stdcall;
...
end;
最佳答案
我无声地假设您通过实现IInternetProcol
以及IInternetProtocolSink
和IInternetBindInfo
接口来拦截流量,并调用原始的IInternetProtocol
完成工作。在这种情况下,重要的是要知道谁叫谁的方向。
如果原始处理程序需要其他标头,它将首先将您的IInternetProtocolSink
强制转换为IServiceProvider
接口(带有QueryInterface
),然后为QueryService
实例调用IHttpNegotiate
。为方便起见,您可以添加当前对象实例,也可以在同一对象上实现IHttpNegotiate
,但这不是必需的。
当调用BeginTransaction
的IHttpNegotiate
方法时,在Start调用的IHttpNegotiate
上获得一个ProtSink
实例,调用BeginTransaction
并添加您的标头,然后再将其传递给调用方。