5

通过 Suitetalk API 连接到 NetSuite 生产帐户时出现以下错误:

在此处输入图像描述

我在连接到此客户端的沙盒帐户时没有问题。我正在通过 C# WCF 项目进行连接。我不认为问题出在 c# 项目上,因为此代码正在与许多其他客户一起在生产中使用。

在我看来,返回的 SOAP 消息格式不正确 - 在 SOAP 消息中的“soapenv”元素之前似乎有一个换行符。创建针对 API 的“获取”请求(使用护照登录)时出现此错误。这个错误发生在任何 API 调用上,但我也尝试过简单地通过 API 登录。

我已经仔细检查了该客户的登录详细信息和帐户信息,一切似乎都井井有条。此外,如果此信息不正确,我应该会收到身份验证错误 - 不是格式错误的 SOAP 消息。

任何帮助将不胜感激,谢谢!

4

3 回答 3

3

事实证明,我需要使用 webservices.na3.netsuite WSDL。我的印象是常规的“webservices.netsuite”WSDL 会将任何请求定向到正确的服务器。

因此,当通过 SuiteTalk 连接到 NetSuite 帐户时,请务必使用正确的 WSDL 并指定正确的端点以及您的登录凭据。您可以在登录到您的 NetSuite 帐户时通过查看 URL 来检查您的帐户托管在哪个服务器上。

更新

我利用最新的“DataCenterAwareNetSuiteService”类为我尝试连接的当前帐户动态获取正确的数据中心:

class DataCenterAwareNetSuiteService : NetSuiteService
{

    private System.Uri OriginalUri;

    public DataCenterAwareNetSuiteService(string account, bool doNotSetUrl)
        : base()
    {
        OriginalUri = new System.Uri(this.Url);
        if (account == null || account.Length == 0)
            account = "empty";
        if (!doNotSetUrl)
        {
            //var temp = getDataCenterUrls(account);
            DataCenterUrls urls = getDataCenterUrls(account).dataCenterUrls;
            Uri dataCenterUri = new Uri(urls.webservicesDomain + OriginalUri.PathAndQuery);
            this.Url = dataCenterUri.ToString();
        }
    }

    public void SetAccount(string account)
    {
        if (account == null || account.Length == 0)
            account = "empty";

        this.Url = OriginalUri.AbsoluteUri;
        DataCenterUrls urls = getDataCenterUrls(account).dataCenterUrls;
        Uri dataCenterUri = new Uri(urls.webservicesDomain + OriginalUri.PathAndQuery);
        this.Url = dataCenterUri.ToString();
    }
}

上面是这样调用的:

new DataCenterAwareNetSuiteService("*account number*", false);
于 2018-07-12T07:09:57.413 回答
1

在最新版本的 NetSuite 中,对 URL 进行了一些更改。例如,现在您可以拥有多个 SandBox URL。因此,URL 格式已更改。验证时使用的帐号现在也不同了。对于沙盒,帐户 ID 现在作为 ACCOUNTNUMBER_SANDBOXID 向上传递,例如 12345678_SB1。

datacenterurls您可以通过使用端点并提供您想为其确定 URL 的帐户 # 来确定SOAP 和 REST 服务的 URL。

https://rest.netsuite.com/rest/datacenterurls?account=YOUR_ACCOUNT_NUMBER

于 2018-08-01T21:00:55.067 回答
1

下面的功能基于上面@Charl 的答案。我在下面进行了一些更改,它们提供了相同的功能而不使用继承。对于不知道如何使用继承类的新程序员来说,这可能是一个更简单的实现。

    var accountId = "1234567"; // Insert your account ID here
    var Service = new NetSuiteService();
    Service.Url = new Uri(Service.getDataCenterUrls(accountId).dataCenterUrls.webservicesDomain + new Uri(Service.Url).PathAndQuery).ToString();
于 2019-04-24T21:25:03.257 回答