因此,我想在使用其余SDK进行请求时增加对所有协议的支持。这是Windows支持的默认协议:
默认情况下,在Windows 7和Windows 8中仅启用SSL3和TLS1。默认情况下,在Windows 8.1和Windows 10中仅启用SSL3,TLS1.0,TLS1.1和TLS1.2。
在创建请求之前,我设置了一个http_client_config并为set_nativehandle_options创建了一个回调,如下所示:
std::function<void(web::http::client::native_handle)> get_callback()
{
auto func = [&](const web::http::client::native_handle handle)
{
std::cout << "handle: " << std::hex << handle << std::endl;
DWORD secure_protocols = WINHTTP_FLAG_SECURE_PROTOCOL_ALL;
if (!WinHttpSetOption(handle, WINHTTP_OPTION_SECURE_PROTOCOLS, &secure_protocols, sizeof(secure_protocols)))
{
std::cout << "Can not set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
std::cout << std::dec << GetLastError() << std::endl;
}
else
std::cout << "Set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
};
return func;
}
因此,基本上,问题在于WinHttpSetOption始终返回ERROR_INTERNET_INCORRECT_HANDLE_TYPE。不幸的是,这与this网站上的声明相反:
native_handle是以下类型,具体取决于基础平台:Windows桌面,WinHTTP-HINTERNET Windows运行时,WinRT-IXMLHTTPRequest2 * ....
我找到了github issue来解决此问题,但似乎从未解决过。
也许任何人都知道可能出什么问题。
答案 0 :(得分:0)
好吧,好像功能已经坏了。我只是迷上了WinHttpOpen,它返回了我应该使用的句柄,并且该函数运行良好。
答案 1 :(得分:0)
这应该很好
web::http::client::http_client_config GetHttpConfig()
{
web::http::client::http_client_config config;
auto func = [&](web::http::client::native_handle handle) {
HINTERNET hSession = WinHttpOpen(L"TestApp",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
DWORD secure_protocols = WINHTTP_FLAG_SECURE_PROTOCOL_ALL;
if (!WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS, &secure_protocols, sizeof(secure_protocols)))
{
std::cout << "Can not set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
std::cout << std::dec << GetLastError() << std::endl;
}
else
{
std::cout << "Set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
handle = hSession;
}
};
config.set_nativehandle_options(func);
return config;
}