连接强制关闭错误与 32 位 COM 组件调用
本文关键字:COM 组件 调用 错误 连接 | 更新日期: 2023-09-27 18:35:35
我在Visual Studio 2008 Microsoft有一个.asmx Web服务,它调用了一个类库方法。类库方法调用在 32 位计算机上生成的第三方 COM 组合。
我的 Web 服务器是 64 位 Windows Server 2012 R2 标准版。我已在此服务器上通过 IIS 版本 8.5 部署了此 Web 服务。
当我第一次访问此 Web 服务时,我被抛出了一个 COM 异常,如下所示:
异常:System.Runtime.InteropServices.COMException 消息:使用 CLSID 检索组件的 COM 类工厂 {某些 GUID} 由于以下错误而失败:80040154。
为了解决此错误,我在 IIS 中的应用程序池设置中进行了一些更改。我转到 IIS 中相关应用程序池的高级设置,并将"启用 32 位应用程序"属性设置为 false。然后,我重新启动了应用程序池和 IIS。
再次当我通过调试单元测试访问 Web 服务时,这次我没有遇到上述错误,但调试器崩溃并在单元测试中抛出错误消息,如下所示:
测试方法 ABC 抛出异常: System.ServiceModel.CommunicationException:> 接收 HTTP 响应时出错 http://localhost/MyService/MyServices.asmx。这可能是由于服务>终结点绑定未使用 HTTP 协议。这也可能是由于 HTTP 请求上下文被服务器中止(可能是由于服务>关闭)。有关更多详细信息,请参阅服务器日志。
---> System.Net.WebException: 基础连接已关闭: 接收时发生意外的>错误。---> System.IO.IOException:无法从传输连接读取>的数据:远程主机>强行关闭了现有连接。---> System.Net.Sockets.SocketException:现有的 远程主机强行关闭了连接。
我还注意到了管理事件日志,我可以随机看到一个错误:
为应用程序池"默认应用程序池"提供服务的进程遭受了致命的打击 与 Windows 进程激活服务的通信错误。进程> id 为"3580"。数据字段包含错误号。
请帮助我解决此问题。
提前谢谢。
有几件事。您声明:
它是在 32 位机器上构建的。
和
并将启用 32 位应用程序属性设置为 false。
将该设置更改回 True
。您的 COM DLL 很可能是 32 位二进制文件。你将无法将 32 位二进制文件加载到 64 位进程中。
其次,错误代码80040154
意味着您的COM库尚未注册。为此,请打开一个命令行窗口(您需要"以管理员身份运行"):
%SYSTEMROOT%'SysWOW64'regsvr32.exe <path_to_DLL>
例如:
%SYSTEMROOT%'SysWOW64'regsvr32.exe "c:'program files (x86)'MyApp'MyLib.dll"