我正在尝试实现以下目的,但是仅使用一个连接,以避免破坏只有一次允许同一用户登录的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)));
答案 0 :(得分:1)
SAP NCo始终将不同的池用于存储库调用和业务应用程序调用。这意味着如果使用标准动态存储库,它将至少需要2个连接。我想知道这是否真的会破坏您的SAP许可,因为这是使用SAP .NET Connector的推荐和标准方式。您确定吗?
但是,在查询所有RFC元数据之后,不再需要存储库连接。因此,它将在不久后关闭,如果您不需要更多的元数据,就再也不会重新打开。因此,您可以等到存储库池通过定义短ConnectionIdleTimeout
来关闭连接为止-理想情况下,通过单独的目标配置来仅用于存储库元数据查询。或者-在获得RfcRepository
实例和IRfcFunction
对象之后,您可以通过IDestinationConfiguration.ConfigurationChanged
事件主动删除存储库目标,该事件也应立即关闭所有池连接。
或者,您也可以使用静态RfcCustomRepository
和序列化/存储的元数据,而根本不需要用于检索RFC元数据的连接。但是这种方法的缺点是不能再灵活地抵抗ABAP系统端的功能接口修改。
但是再次:我怀疑您的标准方法是否确实会违反SAP许可证。但是,我也不是律师。
PS:在您的示例中,有状态调用上下文的声明是多余的,并且在不需要时应避免使用。