【问题标题】:How to reuse session for Poco::Net::HTTPSClientSession如何为 Poco::Net::HTTPSClientSession 重用会话
【发布时间】:2018-06-19 10:31:52
【问题描述】:

我已经声明了一个 Input_output_class() 类的静态成员变量

Session::Ptr c_pSecureSession=nullptr;

对于每个请求 GET/PUT/DELETE/HEAD,我必须创建一个 Input_output_class() 类的对象。在类的成员函数中 我正在创建一个会话如下 函数获取()

{
if(c_pSecureSession)
{
    s_sess = HTTPSClientSession(host, port, pContext, c_pSecureSession); 
}
else
{
   s_sess = HTTPSClientSession(host, port, pContext);
}
 //pContext is a defaultClientContext from singleton Poco::Net::SSLManager 

s_sess->sendRequest(request);
c_pSecureSession = s_sess->sslSession();
cout <<" c_pSecureSession " << c_pSecureSession <<endl;

//Handle response below

 }

SSL MANAGER 单例初始化代码 ——————

{
Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> ptrHandler = new Poco::Net::AcceptCertificateHandler(false);
Poco::Net::Context::Ptr ptrContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "");
ptrContext->enableSessionCache(true);
Poco::Net::SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);

}

我看到该会话没有被重用,并且我正在为每个请求获取一个新的 c_pSecureSession 指针。

你能帮我如何使用会话缓存..

谢谢。

【问题讨论】:

    标签: c++11 https openssl poco-libraries


    【解决方案1】:

    首先,基础知识 - c_pSecureSessionPoco::AutoPtr,因此每次都是不同的实例。然而,底层的裸指针总是相同的——这就是智能指针范式背后的想法——许多智能指针包装一个“裸”指针。

    从您发布的代码中不清楚您是如何“重用”nullptr Session - 为此,您必须先手动创建一个Session(但是如何,当您还没有套接字?),或者首先创建一个HTTPSClientSession,然后从那里取出它以供后续使用(可行)。

    但是,让我们简单一点 - 你不需要 c_pSecureSession 并且你不需要为每个请求重新创建会话 - 只创建一次:

    s_sess = HTTPSClientSession(host, port, pContext);
    

    由于您已经为上下文启用了缓存,s_sess 中的底层会话将被重用,只需从中发送/接收即可。

    请注意,为了缓存会话,还必须在服务器端启用缓存,并且会话也可能有过期时间 - 如果基础会话过期,将自动重新创建一个新会话。

    有关如何处理会话的示例,请参阅 testCachedSession

    【讨论】:

    • 感谢亚历克斯的回复。我刚刚编辑了代码,因为它看起来像是在尝试重用 nullptr。
    • 再次感谢我错过了在会话中设置keepalive ..这就是它不起作用的原因。现在它正在工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多