QBWC:"Index Out Of Range" 在 do_authenticate()

QBWC: "Index Out Of Range" in do_authenticate()

我正在使用 QuickBooks WebConnector 2.2.0.71 和我的 WCF Web 服务(在 .NET 4.6.1 上)。在 WebConnector 中按 "Update selected" 后 serverVersionclientVersion 请求成功处理,但 authenticate 失败:

20170705.06:31:00 UTC   : QBWebConnector.SOAPWebService.do_authenticate() : *** Calling authenticate() with following parameters:<userName="username"><password=<MaskedForSecurity>
20170705.06:31:00 UTC   : QBWebConnector.SOAPWebService.do_authenticate() : QBWC1012: Authentication failed due to following error message.
Index Out Of Range.
More info:
StackTrace =    в QBWebConnector.WebService.do_authenticate(String& ticket, String& companyFileName)
Source = QBWebConnector

我的 WCF 服务的响应(来自 WCF 测试客户端):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <authenticateResponse xmlns="http://developer.intuit.com/">
      <authenticateResult xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:string>a3f10876-e027-419d-8dd8-3752a852ddae</a:string>
        <a:string>nvu</a:string>
        <a:string>3</a:string>
        <a:string>60</a:string>
        <a:string>60</a:string>
      </authenticateResult>
    </authenticateResponse>
  </s:Body>
</s:Envelope>

文档说“您的回调必须 return 一个包含 4 个可能元素的字符串数组。第一个元素包含 NONE 或 NVU(无效用户)或 BUSY。或者为空 字符串,或作为 QB 公司文件名的字符串。”但在示例中,第一个元素是 guid 标记,因此我发送了包含 5 个元素的数组。

当我发送的不是数组而是 int 值时发生了同样的错误,所以我猜 - 也许我的 xml 有问题?

QBWC 程序员指南第 21 页。

您的 return 身份验证调用将是一个字符串数组,最多包含四个字符串。

数组的第一个成员是会话令牌,它可以是 GUID 或您要用来标识会话的任何其他内容。此令牌将由 QBWC 在会话的后续回调中 return 编辑。

字符串数组的第二个成员可以包含各种各样的东西。

一个。如果身份验证调用中的用户名和密码无效,您将提供值“nvu”。

b。另一方面,如果用户数据有效但您没有为该用户做的工作,您将提供值“none”。

c。如果您确实有该用户的工作要做,您可以提供要在当前更新中使用的公司的完整路径名。

d。如果您想使用当前在客户端打开的任何 QuickBooks 公司,只需提供一个空字符串即可。

字符串数组的可选第三个成员包含下一次更新前等待的秒数。您可以使用它实际上告诉 QBWC 客户端在指定时间内不要打扰您。

字符串数组的第四个可选成员包含用作 Web 服务的 MinimumRunEveryNSeconds 时间的秒数,它告诉 QBWC 需要联系您的 Web 服务的频率。

我不确定为什么文档末尾的 Authenticate 与此不同。

通过将 [XmlSerializerFormat] 添加到 IService 来解决,因此响应变为

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <authenticateResponse xmlns="http://developer.intuit.com/">
      <authenticateResult>
        <string>d0297d33-859d-4259-a598-5fbf328bac3b</string>
        <string>nvu</string>
        <string>3</string>
        <string>60</string>
      </authenticateResult>
    </authenticateResponse>
  </s:Body>
</s:Envelope>