Caching 如何在Vala的libsoup中缓存DNS?

Caching 如何在Vala的libsoup中缓存DNS?,caching,https,dns,vala,http-caching,Caching,Https,Dns,Vala,Http Caching,我在我的Vala应用程序中使用libsoup从Instagram API获取数据。但从中加载一个页面大约需要10秒(而浏览器在1-2秒内显示相同的页面)。起初我认为这是因为HTTPS(HTTPS页面的加载时间比HTTP页面长),但我发现大多数时候它解决了我的最大问题 所以,问题是:是否有任何方法可以缓存DNS结果,以便在每次需要连接主机时不解析主机?还是有可能 下面是我正在使用的函数: public string getResponse (string host) { var sess

我在我的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("RESOLVING\n");
        if (event == SocketClientEvent.RESOLVED) print("RESOLVED\n");
        if (event == SocketClientEvent.CONNECTING) print("CONNECTING\n");
        if (event == SocketClientEvent.CONNECTED) print("CONNECTED\n");
        if (event == SocketClientEvent.PROXY_NEGOTIATING) print("PROXY_NEGOTIATING\n");
        if (event == SocketClientEvent.PROXY_NEGOTIATED) print("PROXY_NEGOTIATED\n");
        if (event == SocketClientEvent.TLS_HANDSHAKING ) print("TLS_HANDSHAKING \n");
        if (event == SocketClientEvent.TLS_HANDSHAKED) print("TLS_HANDSHAKED\n");
        if (event == SocketClientEvent.COMPLETE) print("COMPLETE\n");
    });

    print("start sending\n");
    session.send_message (message);
    print("stop sending\n");
    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()的函数
是一个将
api.instagram.com
替换为给定IP地址的函数。

现在,当instagram更改其IP地址时,您的代码将不再工作……这不是一个很好的解决方案。尝试找出DNS如此缓慢的原因可能会更有用:我非常确定libsoup只使用GIO,它最终会调用
getaddrinfo()
由于某些原因,您的操作系统解析一个地址需要很长时间。我知道,我想我以后会处理它。奇怪的是,解析速度很快,解析速度也很慢,尽管IP是一样的,我想。@jku顺便说一句,您能建议我如何解决这个问题吗?我尝试使用libcurl而不是libsoup(我读过它更快)结果是一样的,所以我认为这不是图书馆的问题。哎呀,api.instagram.com链接应该以http:和https: