更改请求协议restsdk



因此,在使用rest 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。不幸的是,这与本网站上的声明相矛盾:

native_handle是以下类型,具体取决于底层平台:Windows Desktop、WinHTTP-HINTERNET Windows Runtime、WinRT-IXMLHTTPRequest2*。。。。

我发现了一个github问题来解决这个问题,但它似乎从未得到解决。

也许任何人都知道可能出了什么问题。

好吧,这个函数好像刚刚坏了。我刚刚钩住了WinHttpOpen,它返回了我应该使用的句柄,该函数运行得非常好。

这应该可以很好地进行

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;
}

最新更新