如何为 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。
我声明了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。