如何向 HTTP 请求添加自定义标头共12页文档Word格式文档下载.docx
- 文档编号:14108949
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:7
- 大小:26.77KB
如何向 HTTP 请求添加自定义标头共12页文档Word格式文档下载.docx
《如何向 HTTP 请求添加自定义标头共12页文档Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《如何向 HTTP 请求添加自定义标头共12页文档Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
本页内容获取标头世界之窗ASP中的旧库数据访问Web小组短问短答获取标头亲爱的Web小组:
我正在尝试找出一种办法,向IE发出的所有HTTP请求插入一个自定义标头域。
但是到目前为止,还不是非常走运。
请您帮忙!
谢谢,DaleLiaoWeb小组的回答:
您来对地方了,Dale。
播撒希望的光芒正是Web小组的专长。
重用InternetExplorerWebBrowser控件、自动化InternetExplorer,或者编写BrowserHelperObject(BHO)的C++和VisualBasic&
reg;
开发人员具有一个非常方便使用的事件接口,称为DWebBrowserEvents2。
如果您只需为初始HTML页发送自定义标头的话,则可以使用BeforeNavigate2()事件,其Header参数使您能够向传出事务插入任意标头。
但是,因为此事件是对于主URL触发的,对于其任何内嵌内容并不能触发,所以对于图像、脚本文件等不会收到此事件。
有一种肯定能够触发的方法可用于向每个传出事务添加数据。
假设您安装了一个自定义软件程序包(可能具有一些ActiveX&
控件宿主于您站点之外的网页上),您希望将这种情况以信号的形式发送给服务器,而不管用户访问您站点的方式是使用InternetExplorer还是使用WebBrowser主机。
您可以通过向下列注册表项插入一个新的String值,将这些信息附加到InternetExplorerUser-Agent字符串的最后:
\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentControlSet\InternetSettings.0\UserAgent\PostPlatform此项下面定义的任何新String值的名称都将附加到UserAgent字符串的最后,InternetExplorer会将该字符串发送到所有网站。
那些安装了的人会发现,对于您计算机上安装的公共语言运行库版本已经定义了一个值。
这个预先定义的值使得网站能够有条件地向Web浏览器提供托管内容。
如果您不需要使用WebBrowser控件,但是需要消耗使用HTTP的原始数据,则还有另一个选择,就是直接使用URLMoniker(URLMON),这样您就能够使用IHttpNegotiate接口向请求添加附加标头了。
MFC利用CAsyncMonikerFile类使得上述过程变得非常简单,这是一个虚拟类,实现它的目的是为了向URLMON使用的IBindStatusCallback方法提供代码。
您可以重写CAsyncMonikerFile的Open()方法的默认实现,以便提供您的IHttpNegotiate接口实现。
1.创建一个新的MFC类,使其从CCmdTarget继承。
对于这个示例,我们将该类称为NegotiateCallback。
2.使用MFC的BEGIN_INTERFACE_PART宏创建一个内部类,使其实现IHttpNegotiate接口。
MFC会将IHttpNegotiate查询委托给这个内部类。
这些应该在该类的.h文件中。
BEGIN_INTERFACE_PART(HttpNegotiateObj,IHttpNegotiate)STDMETHOD_(HRESULT,BeginningTransaction)(LPCWSTRszUrl,LPCWSTRszHeaders,DWORDdwReserved,LPWSTR*pszAdditionalHeaders);
STDMETHOD_(HRESULT,OnResponse)(DWORDdwResponseCode,LPCWSTRszResponseHeaders,LPCWSTRszRequestHeaders,LPWSTR*pszAdditionalRequestHeaders);
END_INTERFACE_PART(HttpNegotiateObj)3.使用MFC的BEGIN_INTERFACE_MAP宏将IHttpNegotiate添加为一个QI-able接口。
这应该位于该类的.cpp文件中。
BEGIN_INTERFACE_MAP(NegotiateCallback,CCmdTarget)INTERFACE_PART(NegotiateCallback,IID_INegotiateCallback,Dispatch)INTERFACE_PART(NegotiateCallback,IID_IHttpNegotiate,HttpNegotiateObj)END_INTERFACE_MAP()4.提供IHttpNegotiate方法的实现,以便添加标头或检查响应标头。
下面的代码会向传出事务添加一个X-Custom-AppHTTP标头。
请注意,您要负责在每个自定义标头的结尾插入一个CR/LF(回车符/换行符);
否则,您的自定义标头则会省略后面紧跟的标头,从而损坏您的HTTP事务。
另外,还要确保使用CoTaskMemAlloc()来代替C运行库内存管理函数,以便URLMON可以通过调用CoTaskMemFree()来释放您的数据。
STDMETHODIMPNegotiateCallback:
XHttpNegotiateObj:
BeginningTransaction(LPCWSTRszUrl,LPCWSTRszHeaders,DWORDdwReserved,LPWSTR*pszAdditionalHeaders){LPWSTRpszHeader=(LPWSTR)CoTaskMemAlloc(74);
memcpy((void*)pszHeader,(void*)L"
X-Custom-App:
Version1.1.3748.9\r\n"
74);
*pszAdditionalHeaders=pszHeader;
returnS_OK;
}5.创建一个新的MFC类,使其成为CAsyncMonikerFile的子类。
我们将此类称为CFetchData。
6.重写CAsyncMonikerFile的Open()方法。
此方法负责创建MFC用于接收下载状态事件的IBindStatusCallback实现。
您需要使用一个指向NegotiateCallback的IUnknown的指针自己创建此回调,从而使得MFC的IBindStatusCallback实现和您的IHttpNegotiate实现能够得以聚合。
聚合是一个COM技术,它能够使用一个类的功能来扩展另一个类。
在此实例中,这就表示URLMON为IHttpNegotiate在MFC的IBindStatusCallback上执行的所有查询都将委托给您的IHttpNegotiate实现。
BOOLCFetchData:
Open(LPCTSTRlpszURL,CFileException*pError){nc=newNegotiateCallback();
LPDISPATCHpNegCallDisp=nc-GetIDispatch(FALSE);
//Iborrowedthisfromoleasmon.cpp.IPTR(IBindHost)pBindHost(CreateBindHost(),FALSE);
IPTR(IBindCtx)pBindCtx(CreateBindContext(pError),FALSE);
if(pError&
&
(pError-m_cause!
=CFileException:
none))returnFALSE;
//InstantiateourNegotiateCallbackobject,andaggregatewiththe//IBindStatusCallbacksuppliedbyMFC.IPTR(IUnknown)pBSCUnk(CreateBindStatusCallback(pNegCallDisp),FALSE);
IPTR(IBindStatusCallback)pBSC;
pBSCUnk-AddRef();
pBSC.QueryInterface(pBSCUnk);
returnAttach(lpszURL,pBindHost,pBSC,pBindCtx,pError);
}7.为了在数据下载后接收数据,请在CAsyncMonikerFile上实现IBindStatusCallback方法。
CAsyncMonikerFile已经实现了此接口,因此您只需提供重写。
返回页首世界之窗亲爱的Web小组:
我正在开发一个带有胖客户端接口的基于Web的应用程序,它使用IFRAME来模仿一个WindowsMDI(MultipleDocumentInterface)应用程序。
但是我的原型在InternetExplorer中的运行速度好像很慢。
这些IFRAME经常花费很长时间都无法加载,页性能通常也很差。
这个体系结构可取吗,还是InternetExplorer无法处理这样的体系结构?
Web小组的回答:
IFRAME(即嵌入式框架)是一个功能强大的工具,最初在InternetExplorer3.02中引入是为了启用取消停靠的框架窗口。
后来,它逐渐发展为用于在数字仪表板中保存问题域特定的详细数据。
这通常称为"
Web部件"
体系结构。
主页的作用是导航外壳,伪子窗口则宿主来自各种数据源的HTML片断("
)。
SQLServer数字仪表板使用此体系结构,只要记住重要的几点内容,您也可以成功使用此体系结构。
第一个要解决的问题当然是框架间的脚本安全性。
正如DynamicHTMLSDK中详细说明的那样,如果您的IFRAME内容所驻留的域不是主页的话,则该主页无法访问IFRAME的内容。
这是一个安全措施,目的是为了防止框架欺骗,框架欺骗情况下不可信站点会从可信站点获取信息,并且会将内容抽取到可信站点的页中。
尽管document.domain属性有时可以放松此限制,但它取决于两个站点中的内容驻留于同一上层域中;
例如,主站点驻留于中,IFRAME内容驻留于中。
但通常会出现这样的情况,Web部件内容来自合作伙伴公司或者一个最近刚并购的公司,这些内容仍然在原始域下运行。
在这种情况下,当主页位于而IFRAME位于时,document.domain就无法发挥其使用了。
对于后一种设置,唯一已知的规避方法为使用内容包装。
现在有了ASP,使用System或者System.Xml类通过ASPX页从其他网站请求数据变得既简单又高效。
假设您的页宿主于上,而您希望从和检索数据。
您可以编写一个ASPX页,使其宿主于上,让该ASPX页从这些网站检索数据并将其返回浏览器。
这样会掩盖数据的真正来源;
浏览器以为数据来自,根本不知道可能已经使用了其他站点来检索该数据。
另外一个更加微妙的问题是内置到InternetExplorer中的每个服务器的连接
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何向 HTTP 请求添加自定义标头共12页文档 如何 请求 添加 自定义 标头共 12 文档