c# - 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)));
解决方案
SAP NCo 将始终为存储库调用和业务应用程序调用使用不同的池。这意味着如果您使用标准动态存储库,它将需要至少 2 个连接。我想知道这是否真的会破坏您的 SAP 许可证,因为这是使用 SAP .NET 连接器的推荐和标准方式。你确定吗?
但是,在查询完所有 RFC 元数据后,将不再需要存储库连接。因此,如果您不需要更多元数据,它将很快关闭,并且永远不会再次重新打开。因此,您可以等到存储库池关闭连接并定义一个短连接ConnectionIdleTimeout
- 理想情况下,通过仅用于存储库元数据查询的单独目标配置。或者 - 在获得RfcRepository
实例和IRfcFunction
对象之后 - 您通过事件主动删除存储库目标,IDestinationConfiguration.ConfigurationChanged
该事件也应该立即关闭所有池连接。或者,您也可以使用静态RfcCustomRepository
和序列化/存储的元数据,其中根本不需要用于检索 RFC 元数据的连接。但是这种方法的缺点是对ABAP系统端的功能接口修改不再那么灵活。
但同样:我怀疑您的标准方法是否真的违反了 SAP 许可证。不过,我也不是律师。
PS:在您的示例中,您对有状态调用上下文的声明是多余的,如果不是真的需要,应该避免使用。
推荐阅读
- php - 列“class_id”不能为空
- asp.net - Angular 6 不显示远程视频流 WebRTC
- c# - '.heif' 文件未下载,服务器返回 404 Not Found 错误
- dart - 升级到 Dart2/Angular5 导入 template.dart 时出错
- google-cloud-platform - Google Cloud Dataprep 无法跨项目导入 BigQuery 视图
- java - apache shiro 并发用户登录
- sql - 将分组数据拆分为单独的列 SQL
- cucumber - 如何使用 BeforeAll 和 AfterAll 黄瓜注解?
- python - 删除查询集时出现 Django ValidationError
- android - 如何使用警报管理器安排多个通知?