SAP .NET Connector(SAPNCO)& .Net核心

时间:2018-04-03 09:46:36

标签: .net-core sap

SAP .NET连接器与.NET Core框架不兼容。 在使用.NET Core时,还有其他方法可以从SAP检索数据吗?

我已经在nuget包管理器中搜索了一个替代品,但我没有找到一个。我可以使用任何解决方法吗? 我非常希望从.NET Core的性能中受益,但我还需要能够连接到SAP。

4 个答案:

答案 0 :(得分:1)

为了从.NET Core或.NET Framework应用程序进行调用,我开源了一个跨平台的库SapNwRfc

NuGet上获取它:

dotnet add package SapNwRfc

PM> Install-Package SapNwRfc

优势:

  • 跨平台:Windows / Linux / macOS
  • 按约定映射输入和输出模型(零配置)
  • 映射函数是使用表达式树即时生成的
  • 具有重试支持的连接池,DI友好
  • 允许通过简单的可模拟界面进行测试驱动的开发
  • 麻省理工学院许可

该库已经过全面的单元测试,可以投入生产。

示例

string connectionString = "AppServerHost=MY_SERVER_HOST; SystemNumber=00; User=MY_SAP_USER; Password=SECRET; Client=100; Language=EN; PoolSize=5; Trace=8";

using var connection = new SapConnection(connectionString);
connection.Connect();

class SomeFunctionParameters
{
    [SapName("SOME_FIELD")]
    public string SomeField { get; set; }
}

using var someFunction = connection.CreateFunction("BAPI_SOME_FUNCTION_NAME");
someFunction.Invoke(new SomeFunctionParameters
{
    SomeField = "Some value",
});

有关更多详细信息,请参见README

答案 1 :(得分:0)

我接受您在SAP端拥有基于SOAP的服务,并尝试通过.NetCore连接此SAP服务。如果这个senerio是真的,不幸的是你不能通过"添加服务参考来连接SOAP服务和.NetCore。"但您可以搜索" .NetCore Wcf客户服务"。

另一种解决方案是使用Rest Service并模拟SOAP协议。

以下是示例问题和解决方案。

Client to send SOAP request and received response

答案 2 :(得分:0)

我创建了一个库来轻松地从.NET CORE进行SAP RFC调用 Windows,Linux和macOS支持Libray。 检查它是否满足您的需求 https://github.com/nunomaia/NwRfcNet/

答案 3 :(得分:0)

除了 huysentruitw 的出色工作,我还想提一下我们的图书馆:

dbosoft YaNco(Yet another .NET connector):https://github.com/dbosoft/YaNco


亮点:

  • 跨平台
  • DI/单元测试友好
  • 基于函数式编程(使用 Language.Ext
  • ABAP 回调支持
  • dbosoft.eu 提供的商业支持/咨询服务

许可证: MIT

.NET 版本:.NET 4.7.1 及更高版本、.NET Core 2.0 及更高版本、NET 5.0

支持的平台:Windows、Linux 和 MacOS

Nuget: Dbosoft.YaNco


YaNco 使用函数来映射 SAP RFC RFM 的输入/输出,而不是从 / 映射到 POCOs。这为您映射数据的方式提供了很大的灵活性。

示例:

       await context.CallFunction("BAPI_COMPANYCODE_GETLIST",
                Output: f => f
                    .MapTable("COMPANYCODE_LIST", s =>
                        from code in s.GetField<string>("COMP_CODE")
                        from name in s.GetField<string>("COMP_NAME")
                        select (code, name)))
            .Match(
                r =>
                {
                    foreach (var (code, name) in r)
                    {
                        Console.WriteLine($"{code}\t{name}");
                    }
                },
                l => Console.WriteLine($"Error: {l.Message}"));