NCo3.1(08) - Nco3 服务器端编程

本篇博文不再重复ABAP调用外部服务器的基础,只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考:

SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程
PyRFC 服务器端编程要点

创建项目

新建一个 Console 项目,选择 .Net Framework 平台。目前 NCo 3.1 不支持 .Net Core。

NCo3.1(08) - Nco3 服务器端编程_第1张图片

NCo3.1(08) - Nco3 服务器端编程_第2张图片

点击「Create」按钮,完成项目的创建。

添加引用

SAP 已经对 NCo3.0 停止技术支持,所以建议使用 3.1 版本。3.1 版可以从 SAP Connector for Microsoft .NET 下载,但需要下载权限。在本文的源码中,提供了 NCo3.1 的安装程序,以方便没有下载权限的同学。

NCo3.1 安装之后 sapnco.dll 和 sapnco_utils.dll 位于不同的文件夹中。默认的位置为:

NCo3.1(08) - Nco3 服务器端编程_第3张图片

因为我下载的是 64 位版本,dll 文件在 GAC_64 文件夹下面。

NCo3.1(08) - Nco3 服务器端编程_第4张图片
NCo3.1(08) - Nco3 服务器端编程_第5张图片

配置

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;
		}
	}
}

ABAP 函数处理器

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服务器返回的消息!");
        }
    }
}

RFC Server

最后在 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

NCo3.1(08) - Nco3 服务器端编程_第6张图片

你可能感兴趣的:(#,NCo3.0,SAP)