【问题标题】:SOAP error when connecting to NetSuite web services: "Namespace prefix ' soapenv' not defined"连接到 NetSuite Web 服务时出现 SOAP 错误:“未定义命名空间前缀 'soapenv'”
【发布时间】:2018-07-02 10:57:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 看起来你在命名空间声明中有一个额外的回车。有没有可能在途中的某个地方出现错误编辑?
  • 我没有声明任何命名空间。我正在使用 SuiteTalk WSDL 连接到 API,并且在运行 _service.get(recordRef{...}) 命令时发生此错误。返回的 SOAP 对象似乎不正确 - 这就是它看起来像 NetSuite 问题的原因。
  • 向 Netsuite 提交案例。有好几次,我在一个帐户中出现了错误,而在另一个帐户中却没有出现。您可能只需要等待,但如果您提交案例,他们可能会尽快更新您的邮箱
  • 谢谢。我已经立案了。我总是在一边做一些研究,或者在等待的时候在 Stack Overflow 上提问,然后就是看谁能先解决问题。解决后我会发布更新。
  • 这是一场比赛?有NS支持吗?你是在地质年代计算的吗?

标签: c# soap netsuite suitetalk


【解决方案1】:

事实证明,我需要使用 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);

【讨论】:

  • 嗨@Charl,您是如何为那些没有信用额度的客户创建发票的,我遇到了问题,如果您能与我分享一些详细信息,我将不胜感激stackoverflow.com/questions/52686093/…
【解决方案2】:

在最新版本的 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

【讨论】:

  • 谢谢。我已经设法解决了这个问题。您可以查看我对我自己的答案的编辑。这似乎更通用一些。
【解决方案3】:

下面的功能基于上面@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();

【讨论】:

  • 感谢您的回答。虽然这是一个关于如何与服务交互的更简单问题的好答案,但我认为您并没有完全解决 OP 遇到的问题。
  • @Jamie Marshall 我遇到了与 OP 完全相同的问题,这就是我最终来到这里的原因。他在上面发布的解决方案正是解决问题所需要的。我添加了一个新答案,因为我不想在我的项目中使用继承的类。我不是想争论,而是想知道在回答时我应该做些什么不同的事情?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多