最近我发现我可以修改一个在线存储的txt文件,然后当我使用 QHttp 获取它时,我仍然得到以前的版本。我的代码也使用 QtWebKit 所以这可能与问题有关吗?或者我可能只是错过了一个阻止缓存的设置?
(我在Windows 7下使用Qt 4.7.3并使用Visual Studio 2010外接程序进行编译)
我正在执行以下操作以防止 QtWebKit 缓存任何内容 -
QWebSettings::globalSettings( )->setAttribute( QWebSettings::PrivateBrowsingEnabled, true );
QWebSettings::globalSettings( )->setAttribute( QWebSettings::LocalContentCanAccessRemoteUrls, true );
QWebSettings::setMaximumPagesInCache( 0 );
QWebSettings::setObjectCacheCapacities( 0, 0, 0 );
QWebSettings::clearMemoryCaches( );
我用来加载txt文件的代码如下 -
CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
this->urlId = urlId;
QUrl url = QUrl( stringUrl );
http = new QHttp( this );
connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
pBytes = bytes;
buffer = new QBuffer( pBytes, this );
buffer->open( QIODevice::WriteOnly );
http->setHost( url.host( ));
fetchId = http->get( url.toString( ), buffer );
}
我用来与之对应的插槽是 -
void CacheHTML::Loaded( int id, bool error ) {
if( id != fetchId )
return;
if( error ) {
emit CacheComplete( urlId, false );
return;
}
emit CacheComplete( urlId, true );
}
但是一旦它从互联网上获取了txt文件,它似乎就在某处/以某种方式缓存它。无论我在txt文件中做了什么更改,当我运行我的代码时,它仍然会缓冲原始文件。
我已经尝试过OrcunC的建议(下面),但是这会导致收到一个空字符串而不是txt文件的内容 -
CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
this->urlId = urlId;
QUrl url = QUrl( stringUrl );
http = new QHttp( this );
connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
pBytes = bytes;
buffer = new QBuffer( pBytes, this );
buffer->open( QIODevice::WriteOnly );
QHttpRequestHeader header( "GET", url.path( ));
header.setValue( "Cache-Control", "no-cache" );
header.setValue( "Host", url.host( ));
http->setHost( url.host( ));
fetchId = http->request( header );
}
我也试过以不同的方式实现它,如下所示,但得到的结果就像缓存txt文件一样。即使使用 bool fromCache = reply->属性(QNetworkRequest :: SourceIsFromCacheAttribute).toBool()检查已完成插槽中的 QNetworkReply ,的假
QNetworkAccessManager* manager = new QNetworkAccessManager( this );
connect( manager, SIGNAL( finished( QNetworkReply* )), this, SLOT( Loaded( QNetworkReply* )));
QNetworkRequest req = QNetworkRequest( QUrl( stringUrl ));
req.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork );
req.setAttribute( QNetworkRequest::CacheSaveControlAttribute, false );
manager->get( req );
我现在已经结束了,所以非常感谢任何指点我正确方向的人。
答案 0 :(得分:1)
代理可能正在缓存文件内容。尝试以下内容清除缓存:
QHttpRequestHeader header("GET", "/mytext.txt");
header.setValue("Cache-Control", "no-cache");
header.setValue("Host", "myhost.com");
http->setHost("myhost.com");
fetchId = http->request(header);
答案 1 :(得分:0)
这似乎是一个愚蠢的建议,但是......你试过在网络浏览器中加载txt吗?并检查它是否更新更改?问题可能在某个地方,而不是在你的应用程序中......