【问题标题】:How can I add an extra http header using IHTTPNegotiate?如何使用 IHTTPNegotiate 添加额外的 http 标头?
【发布时间】:2013-10-17 04:36:24
【问题描述】:

如何使用 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;

【问题讨论】:

  • 你能显示更多代码吗?如果您正在为 URL 命名空间实现 pass-through pluggable protocol handler,则应该有一个单独的对象实现 IInternetProtocolSink 以传递给上游协议处理程序。这也是应该实现IServiceProviderIHttpNegotiate 的对象。

标签: delphi webbrowser-control delphi-xe4 twebbrowser urlmon


【解决方案1】:

我默默地假设您通过实现IInternetProcol IInternetProtocolSinkIInternetBindInfo 接口来拦截流量,并调用原始IInternetProtocol 来完成工作。在这种情况下,了解谁呼叫谁的方向很重要。

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

当您的IHttpNegotiateBeginTransaction 方法被调用时,在开始调用的ProtSink 上获取IHttpNegotiate 实例,调用BeginTransaction 并添加您的标头,然后再将它们传递给调用者.

【讨论】:

  • 我认为这不会在请求中添加标头。
  • 这只会获取请求标头。但它不会添加额外的标题。
  • 再读一遍最后一段。密切。
  • 你说的我试过了,还是不行。它需要一个实际的代码示例。顺便问一下,你以前测试过这个吗?你能添加额外的标题吗?
  • 只是为了确保我理解:您想要一个额外的标头到达浏览器,还是您希望在向网络服务器发出的请求中添加一个额外的标头?
猜你喜欢
  • 2017-12-27
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2013-11-27
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多