.NET Core client 调用 SAP PO SOAP Web Service 接口

海典
2023-12-01

还有一种趋势是请求 REST 服务。但是,我仍然认为有许多有效的用例,其中SOAP是更好的选择。为了加快速度,您可以在与 .NET 开发人员合作时通过此博客文章。

先决条件:
已安装 .NET Core SDK
生成 Web 服务客户端引用类并添加库
Java wsimport 相当于 .NET Core 是 dotnet-svcutil

dotnet tool install --global dotnet-svcutil
点网工具列表 -g
通常,它会将工具添加到 PATH 中。您可能需要关闭并重新打开航站楼。如果这不起作用,则应将此目录添加到环境变量 PATH:
%USERPROFILE%.dotnettools

使用 WSDL 生成客户端类:

dotnet-svcutil calculator-v1.wsdl
生成具有命名空间的类:

dotnet-svcutil SI_SEND_ORG_DATA.wsdl -n *,MDP.MyAwesomePO.WSClient
此命令将创建服务引用。您可以将该类复制到项目中。默认情况下,它不会创建同步方法,但有一个选项(–sync)。您可以使用 –help 来查看选项。

您必须将这些包添加到项目中:

dotnet add package System.ServiceModel.Primitives
dotnet add package System.ServiceModel.Http
不要忘记运行“点网恢复”。

使用参考类
我喜欢以编程方式设置终结点、用户名和密码。如果必须通过 HTTP 使用基本身份验证,则绑定配置会很有帮助。

String endpointurl = "http://hostname:port/XISOAPAdapter/MessageServlet?senderParty=&senderService=BC_SENDER_SYSTEM0&receiverParty=&receiverService=&interface=SI_SEND_ORG_DATA&interfaceNamespace=http://example.com/HR/OrganisationData";
BasicHttpBinding binding = new BasicHttpBinding();
//If you need HTTP with Basic Auth for internal network or dev environments. Otherwise remove these two lines:
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

EndpointAddress endpoint = new EndpointAddress(endpointurl);
var wsclient = new SI_SEND_ORG_DATAClient(binding, endpoint);
wsclient.ClientCredentials.UserName = "username";
wsclient.ClientCredential.Password = "password";

//Here you can use client
var request = new SI_SEND_ORG_DATA();
request.field="value"
var response = await wsclient.SI_SEND_ORG_DATAAsync(request);

当心整数/双精度
来自Java,其中一件让我印象深刻的事情是为SOAP请求设置一个整数值。

如果您有一个字段(如 xsd:integer 或 xsd:double)映射到没有 null 的 .Net 内置类型,则必须将“指定值”设置为 true。
例:

请求。第一个数字 = 2;
请求。FirstNumberSpecified=true;
这是区分具有 0 的元素和无元素的解决方案。我敢肯定,您在尝试使用 ABAP 代理发送值为 0 的整数时遇到了此行为。因为在 ABAP 中,整数初始值为 0,对于出站 XML 处理,它被视为 null。

 类似资料: