使用在IIS下运行的ASP.NET控制iTunes

时间:2012-02-03 17:01:23

标签: asp.net iis com interop itunes

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

  

使用CLSID检索组件的COM类工厂       {DC0C2640-1415-4644-875C-6F4D769839BA}由于以下错误而失败:       80080005服务器执行失败(来自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 Type Library和iTunes.Interop.dll文件都给了我同样的错误。奇怪的是,错误(DC0C2640-1415-4644-875C-6F4D769839BA)中的CLSID与iTunes的“应用程序ID”不匹配,因为它在组件服务\ 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库。这也不起作用。我在完全独立运行的2台计算机上复制了这个问题,在两台计算机上,Visual Studio开发服务器(以及控制台和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。:我已经浏览了互联网并在多台计算机上多次尝试了我上面提到的所有解决方案,因此请在回复时牢记这一点。感谢。

1 个答案:

答案 0 :(得分:1)

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

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