连接到 NetSuite Web 服务时出现 SOAP 错误:"Namespace prefix ' soapenv' not defined"
SOAP error when connecting to NetSuite web services: "Namespace prefix ' soapenv' not defined"
我在通过 Suitetalk API 连接到 NetSuite 生产帐户时遇到以下错误:
我在连接到此客户端的 Sandbox 帐户时没有遇到任何问题。我正在通过 C# WCF 项目进行连接。我不认为问题出在 c# 项目上,因为此代码正在与许多其他客户一起用于生产环境。
在我看来,返回的 SOAP 消息格式不正确 - SOAP 消息中的 'soapenv' 元素之前似乎有一个换行符。我在针对 API(使用护照登录)创建 "get" 请求时遇到此错误。虽然这个错误发生在任何 API 调用上,但我也尝试通过 API 简单地登录。
我已经仔细检查了该客户的登录详细信息和帐户信息,一切似乎都井井有条。此外,如果此信息不正确,我应该收到身份验证错误 - 而不是格式错误的 SOAP 消息。
任何帮助将不胜感激,谢谢!
事实证明我需要使用网络服务。na3.netsuite WSDL。我的印象是常规的“webservices.netsuite”WSDL 会将任何请求定向到正确的服务器。
因此,当通过 SuiteTalk 连接到 NetSuite 帐户时,请务必使用正确的 WSDL 并指定正确的端点以及您的登录凭据。您可以在登录到您的 NetSuite 帐户时通过查看 URL 来检查您的帐户托管在哪个服务器上。
Update
I made use of the newest 'DataCenterAwareNetSuiteService' class to dynamically get the correct data center for the current account that I am trying to connect to:
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);
使用最新版本的 NetSuite,对 URLs 进行了一些更改。例如,现在您可以拥有多个 SandBox URL。因此,URL 格式发生了变化。认证时使用的帐号现在也不同了。对于沙箱,帐户 ID 现在向上传递为 ACCOUNTNUMBER_SANDBOXID,例如 12345678_SB1.
您可以通过使用 datacenterurls
端点并提供您想要确定 URLS 的帐户来确定 SOAP 和 REST 服务的 URLs。
https://rest.netsuite.com/rest/datacenterurls?account=YOUR_ACCOUNT_NUMBER
以下功能基于上述@Charl 的回答。
我在下面做了一些更改,在不使用继承的情况下提供了相同的功能。
对于不知道如何使用继承 class.
的新程序员来说,这可能是一个更简单的实现
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();
我在通过 Suitetalk API 连接到 NetSuite 生产帐户时遇到以下错误:
我在连接到此客户端的 Sandbox 帐户时没有遇到任何问题。我正在通过 C# WCF 项目进行连接。我不认为问题出在 c# 项目上,因为此代码正在与许多其他客户一起用于生产环境。
在我看来,返回的 SOAP 消息格式不正确 - SOAP 消息中的 'soapenv' 元素之前似乎有一个换行符。我在针对 API(使用护照登录)创建 "get" 请求时遇到此错误。虽然这个错误发生在任何 API 调用上,但我也尝试通过 API 简单地登录。
我已经仔细检查了该客户的登录详细信息和帐户信息,一切似乎都井井有条。此外,如果此信息不正确,我应该收到身份验证错误 - 而不是格式错误的 SOAP 消息。
任何帮助将不胜感激,谢谢!
事实证明我需要使用网络服务。na3.netsuite WSDL。我的印象是常规的“webservices.netsuite”WSDL 会将任何请求定向到正确的服务器。
因此,当通过 SuiteTalk 连接到 NetSuite 帐户时,请务必使用正确的 WSDL 并指定正确的端点以及您的登录凭据。您可以在登录到您的 NetSuite 帐户时通过查看 URL 来检查您的帐户托管在哪个服务器上。
Update
I made use of the newest 'DataCenterAwareNetSuiteService' class to dynamically get the correct data center for the current account that I am trying to connect to:
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);
使用最新版本的 NetSuite,对 URLs 进行了一些更改。例如,现在您可以拥有多个 SandBox URL。因此,URL 格式发生了变化。认证时使用的帐号现在也不同了。对于沙箱,帐户 ID 现在向上传递为 ACCOUNTNUMBER_SANDBOXID,例如 12345678_SB1.
您可以通过使用 datacenterurls
端点并提供您想要确定 URLS 的帐户来确定 SOAP 和 REST 服务的 URLs。
https://rest.netsuite.com/rest/datacenterurls?account=YOUR_ACCOUNT_NUMBER
以下功能基于上述@Charl 的回答。 我在下面做了一些更改,在不使用继承的情况下提供了相同的功能。 对于不知道如何使用继承 class.
的新程序员来说,这可能是一个更简单的实现 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();