【发布时间】:2020-04-13 11:28:48
【问题描述】:
在 64 位 Windows 10 和 IIS 10 上,我正在尝试开发和测试一个本机 HTTP 模块,该模块将充当一组特定脚本文件的 WebSockets 处理程序映射。这都是从 RegisterModule() 开始的原生 C++ 中的。我没有使用 ASP.NET 的任何部分。
当我访问应该调用处理程序的 URL 时,我会收到以下响应:
HTTP 错误 500.21 - 内部服务器错误
处理程序“QuadooWebSocket”的模块列表中有一个错误的模块“WebSocketModule”
详细错误信息:
模块 IIS Web Core
通知 ExecuteRequestHandler
处理程序 QuadooWebSocket
错误代码 0x8007000d更多信息:
IIS 核心无法识别该模块。
我使用 IIS 管理器来设置处理程序映射,它在 applicationHost.config 文件中创建了一个条目。
<handlers accessPolicy="Read, Script">
<other_modules />
<add name="QuadooWebSocket" path="*.qws" verb="*" modules="WebSocketModule" scriptProcessor="E:\dev\projects\trunk\target\debug\ActiveQuadoo.dll" resourceType="File" preCondition="bitness32" />
</handlers>
在此之前,我使用“Windows 功能”控制面板安装了对 WebSockets 的支持,它还在 applicationHost.config 文件中添加了一行。
<globalModules>
<other_modules />
<add name="WebSocketModule" image="%windir%\System32\inetsrv\iiswsock.dll" />
</globalModules>
当我将 Visual Studio 附加到 w3wp.exe 时,我的代码中的任何断点都没有得到解析。未调用 RegisterModule()。 DllMain() 甚至没有被调用。我的模块还实现了 IActiveScript,并且 IIS 确实为经典的 ASP 请求加载了我的模块。
我的代码被构建到一个 32 位模块中,并且我在 applicationHost.config 文件中启用了 enable32BitAppOnWin64="true"。这适用于 Classic ActiveScript/ASP 环境,但是当使用预期通过 RegisterModule() 导出加载的代码时,此设置是否也有效?如果这不是问题,那么是否需要其他步骤来为 WebSockets 启用本机 HTTP 模块?
谢谢!
【问题讨论】:
-
如果没有输入
DllMain,可能是加载时失败。要验证这一点,请尝试在WebSocketModule注册中将System32更改为SysWOW64。或者,启用show loader snaps GFlags 选项,并在调试器下运行代码。这将为您提供有关模块加载失败的足够完整的信息(假设这确实是根本原因)。 -
听起来原生模块没有正确导入。您是否通过运行“\APPCMD.EXE 安装模块”安装了本机模块?然后通过IIS manager->modules->configure native module添加native模块?
标签: c++ winapi websocket iis-10