Проблема с несколькими подключениями 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: Ваше объявление контекста вызова с отслеживанием состояния является излишним в вашем примере, и его следует избегать, если он действительно не нужен.