Asp.net 连接到IIS上运行的aspx代码隐藏中的COM接口?

Asp.net 连接到IIS上运行的aspx代码隐藏中的COM接口?,asp.net,windows,iis,com,atl,Asp.net,Windows,Iis,Com,Atl,我已经基于VisualStudioATL向导创建了一个Windows服务exe,该向导公开了一个COM接口。作为进程内服务器或Windows服务运行时没有问题。我需要一个Windows服务,因为我需要一些进程在IIS访问之外可用 我已经创建了一些网页aspx/C调用我的服务,并且在visualstudio.NET开发服务器中进行了良好的测试。现在,我正在尝试将网页推送到运行在Windows7上的IIS7上进行进一步测试。但是,当页面在IIS下运行时,对我的COM接口的调用都会失败,并出现错误 由

我已经基于VisualStudioATL向导创建了一个Windows服务exe,该向导公开了一个COM接口。作为进程内服务器或Windows服务运行时没有问题。我需要一个Windows服务,因为我需要一些进程在IIS访问之外可用

我已经创建了一些网页aspx/C调用我的服务,并且在visualstudio.NET开发服务器中进行了良好的测试。现在,我正在尝试将网页推送到运行在Windows7上的IIS7上进行进一步测试。但是,当页面在IIS下运行时,对我的COM接口的调用都会失败,并出现错误

由于以下错误,检索组件的COM类工厂失败:80070005访问被拒绝。来自HRESULT的异常:0x80070005 E_访问被拒绝

我已验证该服务是:

在HKCR\Clsid\note下向Windows注册,我注册运行myservice.exe/RegServer,因为regsvr32.exe仅适用于dll myservice.exe具有IIS\u IUSRS用户的读取和执行权限 是64位exe,因此应加载到默认IIS应用程序池空间中 在.NETdevelopmentserver调试器中效果很好,但在IIS中效果不好 你知道为什么这行不通吗?与exe vs dll中包含的COM接口有关吗


IIS是否有可能调用Windows服务中公开的COM接口?

这看起来很像是一个安全/权限问题-因此,首先确保运行IIS工作程序的任何用户都有足够的权限,特别是检查您的ASPNET组是否有权使用COM,我认为默认情况下不会


编辑-发布之后,我确实找到了另一篇可能有用的帖子-

我认为您需要在DCOM配置下授予对站点应用程序池进程的访问权,以使用您的COM对象

转到组件服务 >计算机>我的计算机>DCOM配置分支 在列表中找到服务的AppID或名称。右键单击它并选择属性。 打开“安全”选项卡 选择启动和激活权限,然后选择“自定义”。 授予应用程序池进程ASPNET,但请检查站点的IIS应用程序池属性:本地启动和本地激活。 请让我们知道这是否解决了您的问题

顺便说一下:

> is a 64bit exe (so should load in the default IIS app-pool space)

不完全是这样。应用程序池是ISS控制的进程。无论发生什么情况,您的服务都在其自己的独立进程上运行。因此,您的服务与IIS应用程序池无关。

谢谢各位。我真的很感谢你的回答。你的信息为我指明了正确的方向。该问题实际上是一个安全\权限问题。使问题更加复杂的是,每当我重建服务时,我为IIS_IUSRS设置的权限都会从exe中清除,因此我看到的一些失败是由于对service.exe的简单权限造成的。因此,如果在开发过程中看到间歇性错误,请访问COM对象,然后在重新构建后检查exe的权限!我希望这能帮助别人

最后,以下是我解决问题的方法:

将我的服务应用程序池的“标识”更改为“LocalSystem”,因为我的COM位于系统帐户下运行的Windows服务中-大多数人不需要此级别的IIS管理器|应用程序池|右键单击你的应用程序池|高级设置|标识
应用程序池标识如何?它有通道吗?您可以将其更改为您的身份来测试它。作为LocalSystem运行肯定会消除安全错误,但这并不是一个好主意。LocalSystem是机器上功能最强大的帐户,您确实应该将其使用限制在绝对必要的地方。如果您只是编写一些与编码技术相关的东西,那么这很好。如果你想用它来制造产品,甚至是公司内部的应用程序,你真的应该调查这个问题。不必要地使用LocalSystem类似于从铰链上卸下门,因为钥匙太难使用。添加了执行权限。。。对于IIS_IUSRS来说,这很奇怪。运行服务唯一需要执行权限的是服务控制管理器SCM,它作为LocalSystem运行。您的IIS应用程序未运行该服务;它通过DCOM基础结构启动COM对象,必要时DCOM与SCM对话以启动服务。除非你对应用程序的描述中缺少什么。谢谢。您是对的,IIS_IUSR的执行权限不是必需的。我更新了上面的回复。