如何使用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以及IInternetProtocolSinkIInternetBindInfo接口来拦截流量,并调用原始的IInternetProtocol完成工作。在这种情况下,重要的是要知道谁叫谁的方向。

如果原始处理程序需要其他标头,它将首先将您的IInternetProtocolSink强制转换为IServiceProvider接口(带有QueryInterface),然后为QueryService实例调用IHttpNegotiate。为方便起见,您可以添加当前对象实例,也可以在同一对象上实现IHttpNegotiate,但这不是必需的。

当调用BeginTransactionIHttpNegotiate方法时,在Start调用的IHttpNegotiate上获得一个ProtSink实例,调用BeginTransaction并添加您的标头,然后再将其传递给调用方。

09-25 17:42