通过 QBXML 连接到已经打开的 Quickbooks 实例

Connect to already open Quickbooks instance via QBXML

我正在尝试帮助拥有通过 QBXML SDK 与 Quickbooks 集成的 Web 应用程序 (ASP/C#) 的客户。

我想在用户会话中打开一个已激活的 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);

照原样,这将尝试通过 DCOM 启动 Quickbooks 的新实例,这不是一个可行的选项。按照 QBSDK 文档,我试图将 null 传递给 BeginSession 的第一个参数,它应该使用打开的 qbw 文件。

但是,它启动了一个新实例,而不是连接到 Quickbooks 的 运行 实例的预期操作,最终产生了错误:

"If the QuickBooks company data file is not open, a call to the "BeginSession" 方法必须包含数据文件的名称。"

IIS AppPool 运行 Web 应用程序使用与我尝试连接的 Quickbooks 实例相同的用户。

这一切都是由不再可用的第三方设置的,当然,他们没有留下任何关于该系统应该如何工作的文档。欢迎任何帮助。

I'm trying to help a client who has a web application (ASP/C#) that integrates with Quickbooks via the QBXML SDK.

不幸的是,这种方法行不通。

QuickBooks 的一个众所周知的限制是:

  1. QuickBooks 必须 运行 在您尝试连接的用户会话中
  2. QuickBooks 必须能够访问 GUI(它使用 GUI 消息泵来运行)

因为您的 Web 应用程序是 运行 来自 IIS 的,所以这两个条件都不满足,与 QuickBooks 的连接将失败。您应该改用 QuickBooks Web 连接器。

I want to open up a connection to an already active QuickBooks instance in a user session.

很遗憾,QuickBooks 不允许这样做。

我设法为我的问题创建了一个可以接受的解决方法,供尝试类似操作的任何人使用。 (老实说,我不推荐。我在这里使用遗留代码。)

首先简单介绍一下我的研究:

QuickBooks 的 QBXml 接口使用 COM 请求进行通信。现在,无论出于何种原因,无论是设计、错误还是 COM 中的限制,Quickbooks 都无法跨 LSA Logon Sessions 进行通信。实际上,这意味着 Quickbooks 运行 所在的同一控制台会话也必须 运行 QBXml 代码。此外,Quickbooks 和您的应用程序必须具有相同的 UAC 提升状态。

我找不到让 IIS 可靠地启动 Quickbooks 的方法。在我之前设置这个系统的人设法通过一些非常……非正统的方法做到了这一点。它非常不稳定,并且是多个问题的原因。

无论如何,我确实以 IIS Express 的形式找到了一个可接受的解决方法。 IIS Express 可以 运行 在标准用户会话下。因此,运行在同一个登录会话下同时使用 Quickbooks 和 Web 应用程序(通过 IIS Express)允许它们成功通信。

这不是一个永久性的解决方案,因为在标准用户范例中 运行 提供这样的服务存在一些缺点,但它是一个可以接受的解决方法,并且将允许我的客户 运行 他们的业务,而我们重构。我计划首先分离与 Quickbooks 通信的应用程序部分,将它们移动到自己的代码库中。这将允许应用程序面向 Web 的部分以更标准的方式运行,并通过比 COM 调用更可靠的方式与 QB 集成代码通信。

感谢 Keith Palmer 帮助我指明了正确的方向。