连接到一个在IIS上运行的代码隐藏的COM接口?

我创build了一个Windows服务(一个基于Visual Studio ATL向导的exe),它暴露了一个COM接口。 作为进程内服务器或Windows服务运行没有问题。 我需要一个Windows服务,因为我需要在IIS访问之外提供一些进程。

我一直在创build一些调用我的服务的网页(aspx / C#),并且在Visual Studio .NET开发服务器中一切正常。 现在,我试图将网页推到IIS 7(在Windows 7上运行)进行进一步testing。 但是,当页面在IIS下运行时,对我的COM接口的调用都会失败并显示错误

“由于以下错误,检索组件的COM类工厂失败:80070005访问被拒绝(从HRESULTexception:0x80070005(E_ACCESSDENIED))。

我已经validation的服务是:

  • 在Windows下注册HKCR \ Clsid \(注意,我注册运行“myservice.exe / RegServer”,因为regsvr32.exe只适用于dll的)
  • myservice.exe已经读取并执行IIS_IUSRS用户的权限
  • 是一个64位的EXE(所以应该加载在默认的IIS应用程序池空间)
  • 在.NET开发服务器debugging器(但不是IIS)

任何想法,为什么这是行不通的? 与包含在exe和dll中的COM接口有什么关系?

在Windows服务中调用一个COM接口的IIS的任何可能性?

我相信你需要授予访问您的网站的应用程序池进程使用您的COM对象,在DCOM配置下。

  • 转到组件服务
  • >计算机>我的电脑> DCOM配置分支
  • 在列表中找到您的服务的AppID或名称。 右键单击它并选择属性。
  • 打开安全选项卡
  • 选择启动和激活权限,然后选择自定义。
  • 授予应用程序池进程(可能是ASPNET,但检查您的站点的IIS应用程序池属性)以下内容:本地启动和本地激活。

请让我们知道这是否解决您的问题。

顺便:

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

这不完全正确。 应用程序池是一个ISS控制的过程。 无论如何,您的服务都可以独立运行。 因此,您的服务与IIS应用程序池无关。

它看起来非常像一个安全/权限问题 – 所以首先确保无论用户运行IIS工作者有足够的权利,特别是检查您的ASPNET组有权限使用COM(我认为它不是默认情况下) 。

编辑 – 张贴后,我找到了另一个可能的帮助 – 也看看这里

多谢你们。 我真的很感激你的回应。 你的信息指出了我正确的方向。 这个问题确实是一个安全\权限问题。 为了解决这个问题,每当我重建我的服务,我为IIS_IUSRS设置的权限被从exe中清除,所以我看到的一些失败是由于service.exe的简单权限。 所以,如果你在开发过程中看到intermitent错误访问你的COM对象,那么在重新构建之后检查你的exe文件的权限! 我希望能帮助别人。

为了完成,这是我如何解决这个问题:

  • (因为我的COM是在系统帐户下运行的Windows服务 – 大多数人不需要这个级别)(IIS管理器|应用程序池|右键单击您的应用程序池|高级设置|标识