奇怪的wininet,为什么服务器的数据变了,抓到的数据却没变
我写了点抓网页的代码:
CInternetSession mySession;
CHttpFile* myHttpFile=NULL;
CString myData="";
CString s;
try
{
myHttpFile=(CHttpFile*)mySession.OpenURL("http://a.aspx");
while(myHttpFile->ReadString(myData))
{
s+=myData;
}
myHttpFile->Close();
delete myHttpFile;
mySession.Close();
delete mySession;
}catch(CException *e)
{
e->Delete();
return "Err";
}
return s;
现在问题是,我每一次能抓到变化的数据,可以不关闭程序,在次请求,和第一次的数据一样。
问题点数:20、回复次数:4Top
1 楼ppzine(老鹰)回复于 2006-06-02 09:02:13 得分 0
没人来,自己顶Top
2 楼DrSmart(斯玛特)回复于 2006-06-05 17:06:16 得分 5
ie缓存问题Top
3 楼ppzine(老鹰)回复于 2006-06-08 18:13:45 得分 0
如何清缓存Top
4 楼seasol(海子@CSDN助手:http://www.cuteie.com/other.asp)回复于 2006-06-08 22:38:22 得分 15
在做“CSDN助手”时也遇到过这个问题。由于IE缓存的问题,使得再次抓取的数据不能立即反映变化。
清存缓存是一种方法。不过可以通过增加一个请求头部信息,If-Modified-Since,将日期设置为过去的时间。那么,底层的wininet总是会向服务器请求最新的数据了。
我使用的是"Msxml2.XMLHTTP"对象,可能添加头部的细节不同,但机制是一致的。
下面附If-Modified-Since头部的构造。
更详细的信息请参考“CSDN助手”的源代码。
http://blog.csdn.net/seasol/archive/2006/06/03/771376.aspx
//构造头部信息(名值对)
void CCSDNTools::getOldTimePair(CString& sTime)
{
getOldTime(sTime);
sTime="If-Modified-Since:"+sTime;
}
//获取过期的时间
void CCSDNTools::getOldTime(CString& sTime)
{
//
SYSTEMTIME st;
memset(&st,0,sizeof(st));
st.wYear=2000;
st.wMonth=1;
st.wDay=1;
//
char* szTime=sTime.GetBuffer(INTERNET_RFC1123_BUFSIZE);
BOOL bhr=InternetTimeFromSystemTime( &st, INTERNET_RFC1123_FORMAT, szTime, INTERNET_RFC1123_BUFSIZE);
sTime.ReleaseBuffer();
}
Top




