Я пытался управлять iTunes с помощью ASP.NET с переменным уровнем успеха, но ни один из них точно не соответствует моей ситуации.Я посмотрел в Интернете и попробовал все предоставленные решения без особой удачи.Я пытался использовать много разных библиотек iTunes COM (даже ту, что есть на сайте разработчиков Apple), но все же не повезло.Проблема в том, что когда я использую сервер разработки Visual Studio для создания экземпляра COM-объекта iTunes - iTunesApp - он отлично работает и позволяет мне управлять iTunes.Это также прекрасно работает в приложениях Console и WinForms.Но как только я переключаю его на использование сервера IIS, кажется, ничего не работает.Мне нужно, чтобы он работал как веб-сайт под ASP.NET, чтобы он мог получать запросы от других устройств.Это имеет огромный потенциал для создания веб-приложения для управления и по сути построения веб-API вокруг iTunes.Выдает следующую ошибку при создании нового экземпляра класса iTunesApp:
Получение фабрики классов COM для компонента с CLSID {DC0C2640-1415-4644-875C-6F4D769839BA} не выполнено из-за следующегоошибка: 80080005 Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Сначала я использовал файл iTunes.Interop.dll
, который используется во многих проектах в Интернете.Я пытался много раз без удачи, а затем попытался зарегистрировать DLL, которая вызвала ошибку о том, что не удалось найти точку входа в DLL.Итак, я обнаружил, что вы должны дать разрешение идентификатору пула приложений, под которым работает веб-приложение, для доступа и выполнения службы DCOM в службах компонентов Windows.Я сделал это, а также дал доступ всем, все еще ничего.Затем я попытался использовать библиотеку COM, установленную iTunes (когда вы переходите на страницу «Добавить ссылку», вместо того, чтобы перейти к файлу DLL, я перешел на вкладку «COM» и выбрал библиотеку типов iTunes), но не повезло.Я подозреваю, что когда я давал разрешение на компонент Windows DCOM, я давал разрешение на установленную библиотеку iTunes COM, так как Windows распознала это как установленное (и я не мог зарегистрировать оригинальный iTunes.Interop.dll - Windows не знала, что это былотам).
И установленная библиотека типов iTunes, и файл iTunes.Interop.dll
дали мне одну и ту же вышеупомянутую ошибку.Как ни странно, CLSID в ошибке (DC0C2640-1415-4644-875C-6F4D769839BA)
не соответствует «идентификатору приложения» iTunes, так как он вызывается в окне «Службы компонентов \ DCOM \ iTunes \ Properties» (F98206B5-F052-4965-9FA0-85F61BC3C19D
).Я подозреваю, что я не даю разрешение на правильный компонент DCOM в Windows.Я искал в своем реестре идентификатор CLSID в сообщении об ошибке, и он не возвращает результатов, поэтому я пришел к выводу, что это не идентификатор приложения какого-либо из компонентов DCOM (все идентификаторы приложения находятся под Computer\HKEY_CLASSES_ROOT\Wow6432Node\AppID
- там его тоже не было)).Но так как это CLSID в ошибке, на него нужно ссылаться куда-то, я просто не могу его нигде найти.Поиск любого идентификатора в Google также бесполезен, поскольку оба возвращают результаты поиска, включающие iTunes, но ни один из них не достаточно специфичен для проблемы.
Я даже попробовал многопоточный подход.Поскольку библиотеки COM работают в модели STA, а веб-серверы работают в MTA, одно из найденных мной решений - преобразовать модель выполнения потоков сервера в STA, а затем вызвать библиотеку COM.Это тоже не сработало.Я продублировал эту проблему на 2 компьютерах, работающих полностью независимо, и на обоих компьютерах сервер Visual Studio Development Server (и приложения Console и 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();
Если многопоточный код поможет, я тоже могу опубликовать это.На данный момент я в значительной степени бесцельна и буду признательна за любую помощь в любом качестве.Спасибо.
PS: Я уже просмотрел Интернет и перепробовал все решения, о которых я упоминал выше, несколько раз на нескольких компьютерах, поэтому имейте это в виду при ответе.Спасибо.