如何为 Poco::Net::HTTPSClientSession 重用会话

How to reuse session for Poco::Net::HTTPSClientSession

我声明了classInput_output_class()

的静态成员变量

会话::Ptr c_pSecureSession=nullptr;

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

{
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_pSecureSession 是一个 Poco::AutoPtr,因此每次都是不同的实例。但是,底层裸指针将始终相同——这就是智能指针范式背后的想法——许多智能指针包装一个 "naked" 指针。

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

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

s_sess = HTTPSClientSession(host, port, pContext);

由于您已经为上下文启用了缓存,因此 s_sess 中的基础会话将被重用,只是 send/receive 来自它。

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

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