我试图帮助拥有通过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实例的预期操作,而是启动一个新实例,最终产生错误:
"如果QuickBooks公司数据文件未打开,则调用" BeginSession"方法必须包含数据文件的名称。"
运行Web应用程序的IIS AppPool使用与我尝试连接的Quickbooks实例相同的用户。
这一切都是由不再可用的第三方设置的,当然,他们没有留下关于该系统应该如何工作的任何文档。欢迎任何帮助。
答案 0 :(得分:1)
我正在尝试帮助拥有通过QBXML SDK与Quickbooks集成的Web应用程序(ASP / C#)的客户端。
不幸的是,这种方法不起作用。
这是QuickBooks的一个众所周知的限制:
由于您的Web应用程序是从IIS中运行的,因此这两个条件都不符合,并且与QuickBooks的连接将失败。您应该使用QuickBooks Web连接器。
我想在用户会话中打开与已经激活的QuickBooks实例的连接。
不幸的是,QuickBooks不允许这样做。
答案 1 :(得分:1)
我设法为我的问题创建一个可接受的解决方法,对于任何尝试类似的东西。 (老实说,我不推荐。我在这里使用遗留代码。)
首先,简要介绍一下我的研究:
与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帮助我指明正确的方向。