sapnco多个连接问题,在创建函数后登录一次,在调用调用后再次登录

时间:2019-11-14 10:31:47

标签: c# sap sap-connector

我正在尝试实现以下目的,但是仅使用一个连接,以避免破坏只有一次允许同一用户登录的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)));

1 个答案:

答案 0 :(得分:1)

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

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

但是再次:我怀疑您的标准方法是否确实会违反SAP许可证。但是,我也不是律师。

PS:在您的示例中,有状态调用上下文的声明是多余的,并且在不需要时应避免使用。