我创建了一个 Windows 服务(一个基于 Visual Studio ATL 向导的 exe),它公开了一个 COM 接口(interface)。作为进程内服务器或 Windows 服务运行没有问题。我需要 Windows 服务,因为我需要一些进程在 IIS 访问之外可用。
我一直在创建一些调用我的服务的网页 (aspx/C#),并且在 Visual Studio .NET 开发服务器中进行的所有测试都运行良好。现在,我正在尝试将网页推送到 IIS 7(在 Windows 7 上运行)以进行进一步测试。但是,当页面在 IIS 下运行时,对我的 COM 接口(interface)的调用都失败并显示错误
“由于以下错误,检索组件的 COM 类工厂失败:80070005 访问被拒绝。(HRESULT 异常:0x80070005 (E_ACCESSDENIED))。”
我已验证该服务是:
- 在 HKCR\Clsid\下向 Windows 注册(注意,我注册运行“myservice.exe/RegServer”,因为 regsvr32.exe 仅适用于 dll's)
- myservice.exe 对 IIS_IUSRS 用户具有读取和执行权限
- 是一个 64 位的 exe(所以应该加载到默认的 IIS 应用程序池空间)
- 在 .NET Developement Server 调试器(但不是 IIS)中运行良好
知道为什么这行不通吗?与 exe 与 dll 中包含的 COM 接口(interface)有关吗?
IIS 是否有可能调用在 Windows 服务中公开的 COM 接口(interface)?
最佳答案
我认为您需要在 DCOM Config 下授予对您网站的应用程序池进程的访问权限才能使用您的 COM 对象。
- 转到组件服务
- > 计算机 > 我的电脑 > DCOM 配置分支
- 在列表中找到您的服务的 AppID 或名称。右键单击它并选择属性。
- 打开“安全”标签
- 选择启动和激活权限并选择自定义。
- 授予应用程序池进程(可能是 ASPNET,但检查您站点的 IIS 应用程序池属性)以下内容:本地启动和本地激活。
如果这能解决您的问题,请告诉我们。
顺便说一句:
> is a 64bit exe (so should load in the default IIS app-pool space)
这不完全正确。应用程序池是 ISS 控制的进程。无论如何,您的服务都在自己独立的进程中运行。因此,您的服务与 IIS 应用程序池无关。
关于asp.net - 在 IIS 上运行的 aspx 代码隐藏中连接到 COM 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15563083/