Проблема с несколькими подключениями 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)));

1 ответ

SAP NCo всегда будет использовать разные пулы для вызовов репозитория и вызовов бизнес-приложений. Это означает, что потребуется как минимум 2 подключения, если вы работаете со стандартным динамическим репозиторием. Мне интересно, действительно ли это нарушит вашу лицензию SAP, поскольку это рекомендуемый и стандартный способ использования SAP .NET Connector. Ты уверен насчет этого?

Однако после запроса всех метаданных RFC подключение к репозиторию больше не потребуется. Вскоре после этого он будет закрыт и больше никогда не будет открываться, если вам не нужны дополнительные метаданные. Таким образом, вы можете подождать, пока пул репозитория закроет соединение с определением короткогоConnectionIdleTimeout- в идеале через отдельную конфигурацию назначения, используемую только для запросов метаданных репозитория. Или - после полученияRfcRepository экземпляр и IRfcFunction объект - вы активно удаляете место назначения репозитория через IDestinationConfiguration.ConfigurationChangedсобытие, которое также должно немедленно закрыть все объединенные соединения. В качестве альтернативы вы также можете работать со статическимRfcCustomRepositoryи сериализованные / сохраненные метаданные, при которых не требуется никакого соединения для получения метаданных RFC. Но у этого подхода есть недостаток, заключающийся в том, что он больше не может быть таким гибким в отношении модификаций интерфейса функций на стороне системы ABAP.

Но еще раз: я сомневаюсь, что ваш стандартный подход действительно нарушит лицензию SAP. Однако я тоже не юрист.

PS: Ваше объявление контекста вызова с отслеживанием состояния является излишним в вашем примере, и его следует избегать, если он действительно не нужен.

Другие вопросы по тегам