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

本篇博文不再重复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;
		}
	}
}

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

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值