首页 > 解决方案 > sapnco 多连接问题,创建函数调用后登录一次,调用调用后再次登录

问题描述

我正在尝试实现以下目标,但只使用一个连接,以避免破坏 sap 许可证,您只能让同一用户登录一次。

我正在使用 sapnco.dll 和 sapnco_util.dll 3.0 版。

以下代码显示了该问题。生成两个连接。一种是在调用 CreateFunction 时,另一种是在调用 Invoke 时。

RfcDestinationManager.RegisterDestinationConfiguration(new SapConnection("test"));
        ExampleSessionProvider sessionProvider = new ExampleSessionProvider();
        sessionProvider.SetSession(sessionProvider.CreateSession());
        RfcSessionManager.RegisterSessionProvider(sessionProvider);

StringBuilder result = new StringBuilder();

        var destination = RfcDestinationManager.GetDestination("test");
        RfcSessionManager.BeginContext(destination);
        var function = destination.Repository.CreateFunction("Z_PKUK01_ZDC_ENGINE_CALLH");
        var requestTable = function.GetTable("ITAB_REQUEST");
        requestTable.Append();
        requestTable.SetValue("LINE", "TestMessage");
        function.Invoke(destination);
        RfcSessionManager.EndContext(destination);
        var responseTable = function.GetTable("OTAB_RESPONSE");
        var row = responseTable.CurrentRow;
        var rowval = row.GetValue("LINE").ToString();
        result.Append(row.GetValue("LINE").ToString()
            .Substring(0, Math.Min(rowval.Length, result.Capacity)));

标签: c#sapsap-dotnet-connector

解决方案


SAP NCo 将始终为存储库调用和业务应用程序调用使用不同的池。这意味着如果您使用标准动态存储库,它将需要至少 2 个连接。我想知道这是否真的会破坏您的 SAP 许可证,因为这是使用 SAP .NET 连接器的推荐和标准方式。你确定吗?

但是,在查询完所有 RFC 元数据后,将不再需要存储库连接。因此,如果您不需要更多元数据,它将很快关闭,并且永远不会再次重新打开。因此,您可以等到存储库池关闭连接并定义一个短连接ConnectionIdleTimeout- 理想情况下,通过仅用于存储库元数据查询的单独目标配置。或者 - 在获得RfcRepository实例和IRfcFunction对象之后 - 您通过事件主动删除存储库目标,IDestinationConfiguration.ConfigurationChanged该事件也应该立即关闭所有池连接。或者,您也可以使用静态RfcCustomRepository和序列化/存储的元数据,其中根本不需要用于检索 RFC 元数据的连接。但是这种方法的缺点是对ABAP系统端的功能接口修改不再那么灵活。

但同样:我怀疑您的标准方法是否真的违反了 SAP 许可证。不过,我也不是律师。

PS:在您的示例中,您对有状态调用上下文的声明是多余的,如果不是真的需要,应该避免使用。


推荐阅读