本篇博文不再重复ABAP调用外部服务器的基础,只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考:
SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程
PyRFC 服务器端编程要点
新建一个 Console 项目,选择 .Net Framework 平台。目前 NCo 3.1 不支持 .Net Core。
点击「Create」按钮,完成项目的创建。
SAP 已经对 NCo3.0 停止技术支持,所以建议使用 3.1 版本。3.1 版可以从 SAP Connector for Microsoft .NET 下载,但需要下载权限。在本文的源码中,提供了 NCo3.1 的安装程序,以方便没有下载权限的同学。
NCo3.1 安装之后 sapnco.dll 和 sapnco_utils.dll 位于不同的文件夹中。默认的位置为:
因为我下载的是 64 位版本,dll 文件在 GAC_64 文件夹下面。
NCo3 需要登录 SAP 的配置和以及 RFC 服务器的配置,通过两个类来进行配置。首先是登录到 SAP 的配置,创建 SAPDestininationConfig 类,实现 IDestinationConfiguration
接口:
public class SAPDestininationConfig : IDestinationConfiguration
{
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
public bool ChangeEventsSupported()
{
return false;
}
public RfcConfigParameters GetParameters(string destinationName)
{
if ("ECC".Equals(destinationName)) {
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "sapecc6"); // or ip address
parms.Add(RfcConfigParameters.SystemNumber, "00"); // instance number
parms.Add(RfcConfigParameters.SystemID, "D01");
parms.Add(RfcConfigParameters.User, "STONE");
parms.Add(RfcConfigParameters.Password, "w123456");
parms.Add(RfcConfigParameters.Client, "001");
parms.Add(RfcConfigParameters.Language, "EN");
parms.Add(RfcConfigParameters.PoolSize, "5");
return parms;
}
else {
return null;
}
}
RFC Server 的配置:
public class RFCServerConfig : IServerConfiguration
{
public event RfcServerManager.ConfigurationChangeHandler ConfigurationChanged;
public bool ChangeEventsSupported()
{
return false;
}
public RfcConfigParameters GetParameters(string serverName)
{
if ("PRD_000".Equals(serverName)) {
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.RepositoryDestination, "ECC");
parms.Add(RfcConfigParameters.GatewayHost, "sapecc6");
parms.Add(RfcConfigParameters.GatewayService, "sapgw00");
parms.Add(RfcConfigParameters.ProgramID, "RFCSERVER");
parms.Add(RfcConfigParameters.ConnectionCount, "5");
return parms;
}
else {
return null;
}
}
}
namespace SAPNCo3.ServerScenario
{
public class FunctionModuleHandler
{
[RfcServerFunction(Name = "STFC_CONNECTION")]
public static void StfcConnection(RfcServerContext context, IRfcFunction function)
{
Console.WriteLine($"Received function call {function.Metadata.Name} from system {context.SystemAttributes.SystemID}.");
// 从ABAP获取 import 参数
String reqtext = function.GetString("REQUTEXT");
Console.WriteLine($"REQUTEXT = {reqtext}\n");
// 设置 export 参数
function.SetValue("ECHOTEXT", reqtext);
function.SetValue("RESPTEXT", "从RFC服务器返回的消息!");
}
}
}
最后在 Program.cs 中直接创建 RFC Server,并启动:
using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SAPNCo3.ServerScenario
{
internal class Program
{
static void Main(string[] args)
{
// Client configuration
RfcDestinationManager.RegisterDestinationConfiguration(new SAPDestininationConfig());
// Server Configuration
RfcServerManager.RegisterServerConfiguration(new RFCServerConfig());
// Function module handlers
Type[] handlers = new Type[1] { typeof(FunctionModuleHandler) };
// Create RFC Server
RfcServer server = RfcServerManager.GetServer("PRD_000", handlers);
// Start server
server.Start();
// 等待client发起调用,指导用户按下 X 键
Console.WriteLine("Server has been started. Press X to exit.\n");
while (true) {
if (Console.ReadLine().Equals("X"))
break;
}
// Server shut down
server.Shutdown(true);
}
}
sap_interface_nco3: SAP NCo 3.0 Demos