asp.net - 使用 IIS 下运行的 ASP.NET 控制 iTunes

标签 asp.net iis com interop itunes

我一直在尝试使用 ASP.NET 控制 iTunes,并取得了不同程度的成功,但没有一个完全适合我的情况。我环顾网络并尝试了所有提供的解决方案,但运气不佳。我尝试过使用许多不同的 iTunes COM 库(甚至是 Apple 开发者网站上的库),但仍然没有运气。问题是,当我使用 Visual Studio 的开发服务器创建 iTunes COM 对象的实例时 - iTunesApp - 它运行完美并允许我控制 iTunes。这也适用于控制台和 WinForms 应用程序。但是一旦我将其切换为使用 IIS 服务器,似乎没有任何效果。我需要它作为 ASP.NET 下的网站运行,以便它可以接收来自其他设备的请求。这对于构建一个 Web 应用程序来控制和基本上构建一个围绕 iTunes 的基于 Web 的 API 具有巨大的潜力。它在创建 iTunesApp 类的新实例时引发以下错误:

Retrieving the COM class factory for component with CLSID {DC0C2640-1415-4644-875C-6F4D769839BA} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).



首先我使用的是 iTunes.Interop.dll网络上的许多项目中使用的文件。我尝试了很多次都没有运气,然后尝试注册 DLL,这引发了关于找不到 DLL 入口点的错误。然后我发现您必须授予运行 Web 应用程序的应用程序池标识的权限,才能访问和执行 Windows 组件服务中的 DCOM 服务。我这样做了,并且还允许访问每个人,但仍然没有。然后我尝试使用 iTunes 安装的 COM 库(当你去添加引用时,而不是浏览到 DLL 文件,我进入了 COM 选项卡并选择了 iTunes 类型库),没有运气。我怀疑当我授予 Windows DCOM 组件的权限时,我授予了已安装的 iTunes COM 库的权限,因为 Windows 将其识别为已安装(并且我无法注册原始的 iTunes.Interop.dll - Windows 不会知道它是那里)。

两者,已安装的 iTunes 类型库和 iTunes.Interop.dll文件,给了我同样的上述错误。奇怪的是,错误中的CLSID (DC0C2640-1415-4644-875C-6F4D769839BA)与 iTunes 的“应用程序 ID”不匹配,因为它在 Component Services\DCOM\iTunes\Properties 窗口中被调用,即 F98206B5-F052-4965-9FA0-85F61BC3C19D .我怀疑我没有授予 Windows 中正确的 DCOM 组件的权限。我在我的注册表中搜索了错误中的 CLSID,但没有返回任何结果,所以我得出结论,它不是任何 DCOM 组件的应用程序 ID(所有应用程序 ID 都在 Computer\HKEY_CLASSES_ROOT\Wow6432Node\AppID 下 - 也没有在那里找到它)。但由于它是错误中的 CLSID,它必须被引用到某个地方,我只是在任何地方都找不到它。在 Google 上搜索任一 ID 也无济于事,因为它们都返回包含 iTunes 的搜索结果,但都没有足够具体的问题。

我什至尝试了多线程方法。由于 COM 库在 STA 模型中运行,而 Web 服务器在 MTA 中运行,我找到的解决方案之一建议将服务器的线程执行模型转换为 STA,然后调用 COM 库。这也不起作用。我在两台完全独立运行的计算机上复制了这个问题,在两台计算机上,Visual Studio Development Server(以及控制台和 WinForms 应用程序)可以运行它,但 IIS 不能。

这是我正在使用的代码(没有多线程):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTunesLib;


namespace NewASPXNetduino2
{
        public partial class _Default : System.Web.UI.Page
        {
                protected void Page_Load(object sender, EventArgs e)
                {
                        Response.Write(WindowsIdentity.GetCurrent().Name + "\n");

                        var iTunes = new iTunesApp();

                        iTunes.Play();
                }
        }
}

错误是在这一行抛出:var iTunes = new iTunesApp();
如果多线程代码有帮助,我也可以发布。在这一点上,我几乎没有方向,并希望以任何身份提供任何帮助。谢谢。

P.S.:我已经在互联网上环顾四周,并在多台计算机上多次尝试了我上面提到的所有解决方案,因此在回复时请记住这一点。谢谢。

最佳答案

我没有使用 iTunes 库的经验,但是您描述的症状对我来说听起来像是一个安全问题。 IIS 可能作为本地帐户 NETWORK_SERVICE 运行,而您提到的其他所有内容(可能)都作为普通用户帐户(您的)运行。

要快速检查这一点,您可以在 IIS 管理器中更改应用程序池使用的帐户(位于身份选项卡下)。如果这有效,那么您要么需要弄清楚是什么在进行安全检查并查看您是否可以将 NETWORK_SERVICE 授权为有效帐户,或者只是使用不同的帐户运行应用程序池。

关于asp.net - 使用 IIS 下运行的 ASP.NET 控制 iTunes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132430/

相关文章:

asp.net - jquery datepicker 使用两个日期选择器的最大日期最小日期控制

c# - IPreviewHandler 抛出无法捕获的异常

c# - 自定义类 ASP.Net 5 MVC 6 中的应用程序设置

javascript - 如何从 ASP.NET 检索 JSONdata 并将其发送到 jQuery? (实现全日历)

.net - 尽管包含 PDB 文件,堆栈跟踪中仍缺少行号

.net - abcpdf 和 XULRunner 失败或临时浏览器配置文件目录错误

javascript - 如何调试使用 iPhone 上的 GPS 的 JavaScript?

multithreading - 旧版 VB6 COM+ DLL 调用 native Win32 DLL——STA 的线程问题?

c++ - 如何识别缺失的依赖项

javascript - 使用 ko.mapping 问题映射 Json 字符串