使用 SAP 适配器的 WCF 服务模型概述
使用 MySAP Business Suite 的 Microsoft BizTalk 适配器显示的操作时,代码将充当适配器的客户端或服务。
代码充当客户端,在 SAP 系统上调用以下类型的操作:
(RFC) 调用远程函数调用。
(tRFC) 调用事务性远程函数调用。
(BAPI) 调用业务应用程序编程接口。
发送中间文档 (IDOC)
代码充当服务来接收以下类型的操作:
接收 RFC (RFC 服务器)
接收 tRFC (tRFC 服务器)
接收 IDOC。
注意
由于 BAPI 是 SAP 系统针对业务对象存储库 (BOR) 的业务对象公开的方法,因此无法接收 BAPI。
在 Windows Communication Foundation (WCF) 服务模型中,客户端和服务之间的服务协定表示为 .NET 接口,操作表示为此接口上的方法。 SAP 适配器和 WCF 提供的工具使你能够根据适配器公开的元数据为目标操作生成此接口。 这些工具还会创建一个 WCF 客户端类,该类可用于调用服务接口中公开的操作。 客户端应用程序可以调用 WCF 客户端类的方法,以调用适配器上的操作。 若要实现从 SAP 适配器接收操作的服务,需要实现为目标操作生成的接口。
以下部分介绍如何使用 WCF 服务模型为 SAP 适配器创建客户端和服务代码。
在 SAP 上创建 WCF 客户端和调用操作
若要使用 WCF 服务模型调用 SAP 适配器上的操作,必须先为目标操作生成 WCF 客户端类。 然后,可以创建此类的实例、WCF 客户端,并调用其方法以在 SAP 系统上执行操作。
调用 SAP 适配器上的操作
生成 WCF 客户端类和帮助程序代码。 使用添加适配器服务引用 Visual Studio 插件或 ServiceModel 元数据实用工具 (svcutil.exe) 生成面向要使用的 SAP 系统项目的 WCF 客户端类。 有关如何生成 WCF 客户端的详细信息,请参阅 为 SAP 解决方案项目生成 WCF 客户端或 WCF 服务协定。
通过指定客户端绑定创建 WCF 客户端实例。 指定客户端绑定涉及指定 WCF 客户端将使用的绑定和终结点地址。 可以在代码中强制执行此操作,也可以在配置中以声明方式执行此操作。 有关如何指定客户端绑定的详细信息,请参阅 为 SAP 系统配置客户端绑定。 以下代码创建可用于在 SAP 系统上调用 RFC 的 WCF 客户端。 它还设置 SAP 系统的凭据。 WCF 客户端是从配置初始化的。
RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"); rfcClient.ClientCredentials.UserName.UserName = "YourUserName"; rfcClient.ClientCredentials.UserName.Password = "YourPassword";
打开 WCF 客户端。
rfcClient.Open();
在步骤 2 中创建的 WCF 客户端上调用方法,以在 SAP 系统上执行操作。 以下代码调用 WCF 客户端 的 SD_RFC_CUSTOMER_GET 方法,以调用 SAP 系统上的 RFC。
microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers = new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0]; rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);
关闭 WCF 客户端。
rfcClient.Close();
使用 SAP 适配器创建和实现 WCF 服务
若要使用 WCF 服务模型从 SAP 适配器接收操作,必须先生成 .NET 接口 (也称为 WCF 服务协定) ,表示 SAP 适配器为操作公开的服务协定。 有关如何执行此操作的详细信息,请参阅 为 SAP 解决方案项目生成 WCF 客户端或 WCF 服务协定。
然后,通过实现生成的接口来实现 WCF 服务。 此类包含用于处理操作并将响应返回到适配器的业务逻辑。 然后,使用服务主机 (System.ServiceModel.ServiceHost) 来托管此服务的实例。
创建和实现 WCF 服务
生成 WCF 服务协定和帮助程序类。 使用添加适配器服务引用插件或 svcutil.exe 生成 WCF 服务协定 (接口) 针对要使用的 SAP 系统项目。 有关如何生成 WCF 客户端的详细信息,请参阅 为 SAP 解决方案项目生成 WCF 客户端或 WCF 服务协定。
从步骤 1 中生成的接口和帮助程序类实现 WCF 服务。 如果在处理操作的数据时遇到错误,处理该操作的方法可能会引发异常,将错误返回给 SAP 系统;否则,该方法必须返回) 响应类为操作生成的相应 (的实例。 必须按如下所示对 WCF 服务类进行特性化:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
如果使用“添加适配器服务引用插件”生成接口,则可以直接在生成的 SAPBindingService 类中的相应方法中实现逻辑。 可以在 SAPBindingService.cs 中找到此类。 以下代码对 SAPBindingService 类进行子类。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,UseSynchronizationContext = false)] class RfcServerClass : SAPBindingNamespace.SAPBindingService { public override Z_RFC_MKD_ADDResponse Z_RFC_MKD_ADD(Z_RFC_MKD_ADDRequest request) { // If either parameter is null throw an exception if (request.X == null || request.Y == null) throw new System.ArgumentNullException(); // Add the two operands int result = (int) (request.X + request.Y); return new Z_RFC_MKD_ADDResponse(result); } }
如果使用 svcutil.exe 生成接口,则必须创建一个实现 接口的类,并在此类的适当方法中实现逻辑。
创建在步骤 2 中创建的 WCF 服务的实例。
// create service instance RfcServerClass rfcServerInstance = new RfcServerClass();
使用 WCF 服务和基本连接 URI 创建 System.ServiceModel.ServiceHost 的实例。 基本连接 URI 不能包含 userinfoparams 或query_string。
// Enable service host Uri[] baseUri = new Uri[] { new Uri("sap://a/YourSAPHost/00") }; ServiceHost srvHost = new ServiceHost(pollingInstance, baseUri);
创建 SAPBinding 并通过设置其绑定属性为操作配置它。 可以在代码中显式执行此操作,也可以在配置中以声明方式执行此操作。 至少必须将 AcceptCredentialsInUri 设置为 true。
// Create and configure a binding for the service endpoint. NOTE: binding // parameters are set here for clarity, but these are already set in the // the generated configuration file SAPBinding binding = new SAPBinding(); // The credentials are included in the connection URI, so set this property to true binding.AcceptCredentialsInUri = true;
将服务终结点添加到服务主机。 为此,请按以下步骤操作:
使用在步骤 5 中创建的绑定。
指定包含凭据的连接 URI,并在query_string (SAP 网关、网关服务和程序 ID) 指定侦听器连接。 有关 SAP 连接 URI 的详细信息,请参阅 创建 SAP 系统连接 URI。
指定服务协定。 这是表示 WCF 服务协定的接口的名称。 对于 RFC,它为“Rfc”。
// Add service endpoint // NOTE: The contract for the service endpoint is "Rfc". // This is the generated WCF service contract (interface) -- see SAPBindingInterface.cs. Uri serviceUri = new Uri("sap://User=YourUserName;Passwd=YourPassword;Client=800;Lang=EN;@a/YourSAPHost/00?ListenerGwServ=SAPGW00&ListenerGwHost=YourSapHost&ListenerProgramId=SAPAdapter"); srvHost.AddServiceEndpoint("Rfc", binding, serviceUri);
若要从 SAP 系统接收操作,请打开服务主机。 每当 SAP 系统对步骤 6 中的服务 URI 中指定的程序 ID 和系统调用操作时,都将调用 WCF 服务。
// Open the service host to begin receiving the operation. srvHost.Open();
若要停止接收操作,请关闭服务主机。
重要
适配器将继续接收操作,直到服务主机关闭。 不再需要接收操作时,应始终关闭服务主机。
srvHost.Close();