Windows 11与QT5.14:请求Server2016时出现8007277C错误求解决
问题
我们有一台部署在AWS实例上的Windows Server 2016 Datacenter数据服务器。在Windows 11设备上使用QT Creator调试编译后的程序时,发起如下HTTP请求:
QUrl("http://server.com/customer/v0/index.php/?object=reset_password&username=blah&email=email@email.com")
每次请求都会在调试窗口输出以下错误日志:
onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!5C5C85D4: (caller: 75EBCD00) LogHr(3) tid(8148) 8007277C No such service is known. The service cannot be found in the specified name space.
该问题源于Windows 11(及部分Win10更新版本)弃用了Layered Service Providers(LSP),现有相关案例未给出明确解决方案。
可行修复/规避方案
1. 强制QT使用WinHTTP API
在QT项目的.pro配置文件中添加以下定义,强制使用微软现代HTTP客户端API替代旧的WinSock相关实现,彻底规避LSP依赖:
QT += network DEFINES += QT_USE_WINHTTP
添加后重新编译整个项目。
2. 重置Windows网络栈
以管理员身份打开命令提示符,执行以下命令重置Winsock目录,清除系统中残留的废弃LSP注册项:
netsh winsock reset
执行完成后重启电脑生效。
3. 显式控制DNS解析流程
在代码中手动处理DNS查询,避免依赖系统默认的命名空间服务解析,示例代码如下:
QDnsLookup dnsLookup(QDnsLookup::A, "server.com"); connect(&dnsLookup, &QDnsLookup::finished, [&]() { if (!dnsLookup.error()) { const auto hostRecords = dnsLookup.hostAddressRecords(); if (!hostRecords.isEmpty()) { QString serverIp = hostRecords.first().value().toString(); // 替换为目标IP构造请求URL QUrl requestUrl(QString("http://%1/customer/v0/index.php/?object=reset_password&username=blah&email=email@email.com").arg(serverIp)); // 发起HTTP请求逻辑 } } dnsLookup.deleteLater(); }); dnsLookup.lookup();
4. 更新QT至最新稳定版本
QT官方在后续版本中针对Windows 11的网络API兼容性问题做了适配,更新到最新稳定版可能直接解决该LSP相关报错。
内容的提问来源于stack exchange,提问作者jabroni
相关产品推荐
相关产品推荐

