我一直在尝试使用 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/