Подключитесь к уже открытому экземпляру Quickbooks через QBXML

Я пытаюсь помочь клиенту, у которого есть веб-приложение (ASP/C#), которое интегрируется с Quickbooks через QBXML SDK.

Я хочу открыть соединение с уже активным экземпляром QuickBooks в сеансе пользователя.

Соответствующий рассматриваемый код:

    if (rp == null)
        rp = new RequestProcessor2();

    if (!connected)
    {
        rp.OpenConnection2("IMS", "Internal Management System", QBXMLRPConnectionType.localQBD);
        connected = true;
    }

    if (xticket == null)
        xticket = rp.BeginSession(cfg.qbfile, QBFileMode.qbFileOpenMultiUser);

Как есть, это попытается запустить новый экземпляр Quickbooks через DCOM, что не является жизнеспособным вариантом. Следуя документации QBSDK, я попытался передать null первому аргументу BeginSession, который должен использовать открытый файл qbw.

Однако вместо ожидаемого действия по подключению к запущенному экземпляру Quickbooks он запускает новый экземпляр, что в конечном итоге приводит к ошибке:

«Если файл данных компании QuickBooks не открыт, вызов метода «BeginSession» должен включать имя файла данных».

Пул приложений IIS, в котором запущено веб-приложение, использует того же пользователя, что и экземпляр Quickbooks, к которому я пытаюсь подключиться.

Все это было установлено третьей стороной, которая больше недоступна, и, конечно же, они не оставили никакой документации о том, как эта система должна была работать. Любая помощь приветствуется.


person Kal Zekdor    schedule 16.01.2015    source источник


Ответы (2)


Я пытаюсь помочь клиенту, у которого есть веб-приложение (ASP/C#), которое интегрируется с Quickbooks через QBXML SDK.

К сожалению, такой подход не сработает.

Это известное ограничение QuickBooks, которое:

  1. QuickBooks должен быть запущен в сеансе пользователя, из которого вы пытаетесь подключиться.
  2. QuickBooks должен иметь доступ к графическому интерфейсу (для работы он использует насос сообщений графического интерфейса)

Поскольку ваше веб-приложение запускается из IIS, ни один из этих двух критериев не выполняется, и подключение к QuickBooks не будет выполнено. Вместо этого вы должны использовать QuickBooks Web Connector.

Я хочу открыть соединение с уже активным экземпляром QuickBooks в сеансе пользователя.

К сожалению, QuickBooks этого не допустит.

person Keith Palmer Jr.    schedule 16.01.2015
comment
В настоящее время веб-коннектор не является жизнеспособным вариантом, поскольку для этого потребуется полностью изменить дизайн устаревшего приложения. Кроме того, вы, кажется, говорите, что невозможно и необходимо запускать quickbooks в сеансе пользователя. Более того, рассматриваемое приложение успешно подключается к экземпляру quickbooks, автоматически запускаемому DCOM. Я понятия не имею, как, ум, но это так. - person Kal Zekdor; 16.01.2015
comment
Где я сказал, что QuickBooks невозможно запустить в сеансе пользователя? Единственный поддерживаемый способ (и единственный надежный способ) сделать то, что вы просите, - это запустить само веб-приложение в том же сеансе обычного пользовательского графического интерфейса, в котором работает QuickBooks. - person Keith Palmer Jr.; 16.01.2015
comment
Вы сказали, что Quickbooks не позволит мне подключиться к экземпляру, работающему под сеансом пользователя. (Последнее предложение ответа.) Я, вероятно, неправильно понимаю какую-то часть, поэтому я попросил разъяснений. Кроме того, надежный или поддерживаемый здесь не имеет значения, важны только возможные варианты. Это устаревшее приложение, созданное ненадежной третьей стороной. Конечной целью является полное переписывание, но мой клиент не может позволить себе это до тех пор, поэтому мне нужно сначала починить этот взломанный черный ящик. - person Kal Zekdor; 16.01.2015
comment
Некоторые дополнительные сведения о проблеме: как я уже упоминал, приложение запускает экземпляр Quickbooks через DCOM (под тем же пользователем, что и сеанс консоли, но с другим сеансом входа в систему). Он открывает файл компании. Однако рассматриваемый экземпляр Quickbooks (после обновления) будет отображать модальное диалоговое окно, ожидая ввода данных пользователем. Однако Quickbooks не будет отвечать на COM-запросы, пока открыто модальное диалоговое окно, и у меня нет средств (которые я нашел) для закрытия указанного диалогового окна, поскольку графический интерфейс находится в другом сеансе входа в систему. - person Kal Zekdor; 16.01.2015
comment
Насколько мне известно, и согласно всему, что говорят поддержка и документы Intuit, вы не можете открыть соединение с QuickBooks из экземпляра IIS для сеанса QuickBooks, работающего в отдельном пользовательском сеансе. Именно это я и имел в виду своей последней фразой. - person Keith Palmer Jr.; 19.01.2015
comment
Знаете, что мешает этому? SDK Quickbooks позволяет сторонним приложениям взаимодействовать с Quickbooks. Кроме того, и рассматриваемое приложение, и Quickbooks работают от имени одного и того же пользователя Windows. - person Kal Zekdor; 20.01.2015
comment
Я не знаю точных технических подробностей — вероятно, никто не знает, кроме сотрудников Intuit. Но сотрудники Intuit много, много, много раз говорили на своих форумах снова и снова, что подключение к QuickBooks напрямую из IIS не сработает. - person Keith Palmer Jr.; 27.01.2015
comment
Мои исследования показывают, что это связано со средствами, которыми QB взаимодействует со службой COM. Что-то в этом отказывается пересекать сеансы входа в систему LSA. Каким-то образом этому парню удалось запустить Quickbooks в том же сеансе входа в систему, что и код asp.net, запускаемый IIS. Может быть, мне стоит посмотреть на COM-прокси... - person Kal Zekdor; 27.01.2015

Мне удалось создать приемлемый обходной путь для моей проблемы для всех, кто пытается что-то подобное. (Что, честно говоря, я не рекомендую. Здесь я работаю с устаревшим кодом.)

Во-первых, краткий обзор моего исследования:

Интерфейс QBXml с QuickBooks использует COM-запросы для связи. Теперь, по какой-либо причине, будь то дизайн, ошибка или ограничение в COM, Quickbooks не может обмениваться данными через Сеансы входа в LSA. На практике это означает, что тот же сеанс консоли, в котором работает Quickbooks, также должен запускать код QBXml. Кроме того, и Quickbooks, и ваше приложение должны иметь одинаковый статус повышения прав UAC.

Я не нашел способа заставить IIS надежно запускать Quickbooks. Человеку, который установил эту систему до меня, удалось сделать это с помощью очень... неортодоксальных методов. Это было невероятно ненадежно и было причиной множества проблем.

Несмотря на это, мне удалось найти приемлемый обходной путь в виде IIS Express. IIS Express может работать в рамках стандартного пользовательского сеанса. Таким образом, запуск и Quickbooks, и веб-приложения (через IIS Express) в рамках одного и того же сеанса входа в систему позволил им успешно взаимодействовать.

Это не постоянное решение, так как запуск такой службы в стандартной пользовательской парадигме имеет недостатки, но это приемлемый обходной путь, который позволит моему клиенту вести свой бизнес, пока мы проводим рефакторинг. Я планирую сначала отделить части приложения, которые взаимодействуют с Quickbooks, переместив их в свою собственную кодовую базу. Это позволит веб-частям приложения работать более стандартным образом и взаимодействовать с кодом интеграции QB с помощью более надежных средств, чем вызовы COM.

Спасибо Киту Палмеру за помощь в выборе правильного направления.

person Kal Zekdor    schedule 03.02.2015