如何阻止 QHttp/QtWebKit 缓存页面

Posted

技术标签:

【中文标题】如何阻止 QHttp/QtWebKit 缓存页面【英文标题】:How to stop QHttp/QtWebKit from caching pages 【发布时间】:2011-08-05 11:06:04 【问题描述】:

最近我发现我可以修改一个在线存储的 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->attribute( QNetworkRequest::SourceIsFromCacheAttribute ).toBool( ) 检查 finished 槽中的 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 );

我现在已经无能为力了,所以非常感谢任何人指出我正确的方向。

【问题讨论】:

【参考方案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);

【讨论】:

感谢您的回复 - 我尝试了您的建议(并修改了原始问题以显示代码)但它导致返回一个空字符串而不是 txt 文件的内容。【参考方案2】:

这似乎是一个愚蠢的建议,但是...您是否尝试过在网络浏览器中加载 txt?并检查它是否更新更改?问题可能出现在某个地方,根本不在您的应用中......

【讨论】:

呃。刚刚注意到这篇文章已经过时了......哦,好吧......希望你不介意。

以上是关于如何阻止 QHttp/QtWebKit 缓存页面的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 chrome 缓存

ASP.NET MVC 阻止当前请求的视图页面缓存OutputCache

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

怎么阻止vue的数据更新刷新事件

如何阻止 Laravel 5 缓存配置?

GraphQL:Apollo 客户端缓存如何工作以保持与服务器的数据一致性?