连接到NetSuite Web服务时出现SOAP错误:“未定义命名空间前缀'soapenv'

时间:2018-07-02 10:57:16

标签: c# soap netsuite suitetalk

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

enter image description here

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

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

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分:-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();