如何在请求头里添加自定属性

 我来答
rub955
2016-12-06 · TA获得超过114个赞
知道小有建树答主
回答量:450
采纳率:0%
帮助的人:242万
展开全部
创建一个新的 MFC 类,使其从 CCmdTarget 继承。对于这个示例,我们将该类称为 NegotiateCallback。
使用 MFC 的 BEGIN_INTERFACE_PART 宏创建一个内部类,使其实现 IHttpNegotiate 接口。MFC 会将 IHttpNegotiate 查询委托给这个内部类。这些应该在该类的 .h 文件中。
BEGIN_INTERFACE_PART(HttpNegotiateObj, IHttpNegotiate)
STDMETHOD_(HRESULT, BeginningTransaction)(LPCWSTR szUrl,
LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders);
STDMETHOD_(HRESULT, OnResponse)(DWORD dwResponseCode,
LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR*
pszAdditionalRequestHeaders);
END_INTERFACE_PART(HttpNegotiateObj)

使用 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()
提供 IHttpNegotiate 方法的实现,以便添加标头或检查响应标头。下面的代码会向传出事务添加一个 X-Custom-App HTTP 标头。请注意,您要负责在每个自定义标头的结尾插入一个 CR/LF(回车符/换行符);否则,您的自定义标头则会省略后面紧跟的标头,从而损坏您的 HTTP 事务。另外,还要确保使用 CoTaskMemAlloc() 来代替 C 运行库内存管理函数,以便 URLMON 可以通过调用 CoTaskMemFree() 来释放您的数据。
STDMETHODIMP NegotiateCallback::XHttpNegotiateObj::BeginningTransaction(LPCWSTR
szUrl, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR
*pszAdditionalHeaders) {
LPWSTR pszHeader = (LPWSTR)CoTaskMemAlloc(74);
memcpy((void*)pszHeader, (void*)L"X-Custom-App: Version
1.1.3748.9\r\n", 74);
*pszAdditionalHeaders=pszHeader;
return S_OK;
}
创建一个新的 MFC 类,使其成为 CAsyncMonikerFile 的子类。我们将此类称为 CFetchData。
重写 CAsyncMonikerFile 的 Open() 方法。此方法负责创建 MFC 用于接收下载状态事件的 IBindStatusCallback 实现。您需要使用一个指向 NegotiateCallback 的 IUnknown 的指针自己创建此回调,从而使得 MFC 的 IBindStatusCallback 实现和您的 IHttpNegotiate 实现能够得以聚合。聚合是一个 COM 技术,它能够使用一个类的功能来扩展另一个类。在此实例中,这就表示 URLMON 为 IHttpNegotiate 在 MFC 的 IBindStatusCallback 上执行的所有查询都将委托给您的 IHttpNegotiate 实现。
BOOL CFetchData::Open(LPCTSTR lpszURL, CFileException* pError) {
nc = new NegotiateCallback();
LPDISPATCH pNegCallDisp = nc->GetIDispatch(FALSE);

// I borrowed this from oleasmon.cpp.
IPTR(IBindHost) pBindHost(CreateBindHost(), FALSE);
IPTR(IBindCtx) pBindCtx(CreateBindContext(pError), FALSE);
if (pError && (pError->m_cause != CFileException::none))
return FALSE;
// Instantiate our NegotiateCallback object, and aggregate with the
// IBindStatusCallback supplied by MFC.
IPTR(IUnknown) pBSCUnk(CreateBindStatusCallback(pNegCallDisp), FALSE);
IPTR(IBindStatusCallback) pBSC;
pBSCUnk->AddRef();
pBSC.QueryInterface(pBSCUnk);
return Attach(lpszURL, pBindHost, pBSC, pBindCtx, pError);
}
为了在数据下载后接收数据,请在 CAsyncMonikerFile 上实现 IBindStatusCallback 方法。CAsyncMonikerFile 已经实现了此接口,因此您只需提供重写。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式