如何在瓦拉的libsoup中缓存DNS



我在我的Vala应用程序中使用libsoup从Instagram API获取数据。但是从中加载一个页面大约需要 10 秒(而浏览器在 ~1-2 秒内显示相同的页面)。我最初认为这是因为HTTPS(HTTPS页面加载的时间比HTTP页面长),但我发现大多数时候它解决了我的问题。

所以,问题是:有什么方法可以缓存DNS结果,以便在每次需要连接到主机时都不解析主机?还是可能?

这是我正在使用的功能:

public string getResponse (string host) 
{
    var session = new Soup.Session ();
    session.ssl_strict = false;
    session.user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
    var message = new Soup.Message ("GET", host);
    message.tls_errors = GLib.TlsCertificateFlags.VALIDATE_ALL;
    message.network_event.connect((event) => {
        if (event == SocketClientEvent.RESOLVING) print("RESOLVINGn");
        if (event == SocketClientEvent.RESOLVED) print("RESOLVEDn");
        if (event == SocketClientEvent.CONNECTING) print("CONNECTINGn");
        if (event == SocketClientEvent.CONNECTED) print("CONNECTEDn");
        if (event == SocketClientEvent.PROXY_NEGOTIATING) print("PROXY_NEGOTIATINGn");
        if (event == SocketClientEvent.PROXY_NEGOTIATED) print("PROXY_NEGOTIATEDn");
        if (event == SocketClientEvent.TLS_HANDSHAKING ) print("TLS_HANDSHAKING n");
        if (event == SocketClientEvent.TLS_HANDSHAKED) print("TLS_HANDSHAKEDn");
        if (event == SocketClientEvent.COMPLETE) print("COMPLETEn");
    });
    print("start sendingn");
    session.send_message (message);
    print("stop sendingn");
    return (string) message.response_body.data;
}

并且大部分加载时间都在"正在解决"和"已解决"之间。

顺便说一句,我认为在 GSettings 中设置一些字段来存储 Instagram API 服务器 IP 并将主机的主机名替换为该 IP 地址是个好主意,这行得通吗?如果可以,如何实施?

我以这种方式重写了我的getResponse函数,现在它按照我想要的方式工作。

public string getResponse (string host) 
{ 
    var ip = loadAddress();
    if (ip == "")
        ip = resolveHost();
    var newHost = replaceHostWithIp(host, ip);
    var session = new Soup.Session ();
    session.ssl_strict = false;
    session.user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
    var message = new Soup.Message ("GET", newHost);
    message.tls_errors = GLib.TlsCertificateFlags.VALIDATE_ALL;  
    message.request_headers.append("Host", "api.instagram.com");
    session.send_message (message);
    if (loadAddress() == "")
        setAddress(ip);
    return (string) message.response_body.data;
}

其中loadAddress()setAddress()是从 GSettings 加载 IP 并设置它的函数,replaceHostWithIp()是用给定 IP 地址替换api.instagram.com的函数。

刚才遇到了同样的问题,我通过使用解决了它

session.set_proxy_resolver(null);

默认代理解析器似乎太慢了。

最新更新