【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数

简介: 【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数

问题描述

在Azure App Service for Windows的环境中,部署.NET应用,其中使用了 SAP NetWeaver RFC函数 (需要加载 sapnwrfc.dll)。详细的错误为:

“System.DllNotFoundException: Unable to load DLL 'sapnwrfc' or one of its dependencies: The specified module could not be found. (0x8007007E)”

那么在App Service中如何来解决这个问题呢?

 

问题解答

在App Service的日志中,除了可见”System.DllNotFoundException: Unable to load DLL 'sapnwrfc' or one of its dependencies: The specified module could not be found“外,也显示 Could not open the ICU common library。如下图:

 

在App Service不能加载ICU通用库的提示下,就需要在代码中显示的加载ICU库。所以在代码中添加 NativeLibrary.Load(path.Combinee(rootDir, "nwrfcsdk", "icuin50")) 即可缓解问题。

代码示例为:

using System.Reflection;
using System.Runtime.InteropServices;
using NwRfcNet;
namespace CallSAPonAppService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            // Add services to the container.
            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();
            var app = builder.Build();
            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }
            app.UseHttpsRedirection();
            app.UseAuthorization();
            app.MapControllers();
            NativeLibrary.SetDllImportResolver(
                assembly: typeof(RfcConnection).Assembly,
                resolver: (string libraryName, Assembly assembly, DllImportSearchPath? searchPath) =>
                {
                    if (libraryName == "sapnwrfc")
                    {
                        var rootDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                        string path = Path.Combine(rootDir, "nwrfcsdk", libraryName);
                        //手动加载ICU库
                        NativeLibrary.Load(path.Combinee(rootDir, "nwrfcsdk", "icuuc50"));
                        NativeLibrary.Load(path.Combinee(rootDir, "nwrfcsdk", "icudt50"));
                        NativeLibrary.Load(path.Combinee(rootDir, "nwrfcsdk", "icuin50"));
                        NativeLibrary.TryLoad(
                            libraryPath: path,
                            handle: out IntPtr handle);
                        return handle;
                    }
                    return IntPtr.Zero;
                });
            app.Run();
        }
    }
}

 

附录一:在App Service Kudu(高级管理工具页面)如何来查看某个依赖是否存在?

如查看是否安装Visual C++ 2013 Redistributable依赖,可以使用如下命令:

reg query "HKLM\SOFTWARE\Classes\Installer\Dependencies\{61087a79-ac85-455c-934d-1fa22cc64f36}"

查看结果如图

 

 

 

参考资料

SapConnection connect issues #5 : https://github.com/huysentruitw/SapNwRfc/issues/5

 

SAP NetWeaver RFC library : https://github.com/huysentruitw/SapNwRfc#prerequisites

This cross-platform library allows you to call SAP NetWeaver RFC functions from .NET 5, .NET Core and the .NET Framework.

The library is fully tested and production ready. Supported operating systems are Windows, Linux and macOS.

相关文章
|
设计模式 开发框架 前端开发
在DevExpress中使用BandedGridView表格实现多行表头的处理
在DevExpress中使用BandedGridView表格实现多行表头的处理
element中el-radio无法切换点击和input框无法输入的问题(整理)
element中el-radio无法切换点击和input框无法输入的问题(整理)
layUI数据表格可编辑扩展下拉框
layUI数据表格可编辑扩展下拉框
818 0
SAP 批量更改物料描述
由于公司业务部门需要,向我提出的这个要求,我就在网上查了下,看到了一位知乎的前辈大神写了但是不是特别详细,笔者测试了下,把过程更详细的记录了一下,也挺好用,就在这里记录和分享一下! 比如现在业务部门提出物料主数据中物料描述维护错了,要批量进行修改,而且每个物料这个字段的值是不一样的,此时可以使用MASS事物码通过EXCEL进行批量维护。经常使用MASS将主数据的某个字段修改为相同的值,其实可以使用MASS导入EXCEL进行字段修改,也可将统一字段修改为不同的值,主数据的更改可以不通过LSMW实现。MASS可以实现很多主数据的修改,进入事物码MASS选择对象类型,可实现对不同主数据的更改!
SAP 批量更改物料描述
|
SQL
SQL SERVER CHARINDEX函数
        CHARINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。即CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。         CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expres
8876 0
|
4月前
|
传感器 人工智能 算法
AI 算法盒子:边缘智能分析网关技术与应用
AI算法盒子是轻量高性能边缘计算设备,支持视频/传感器数据本地实时分析,具备离线推理、毫秒告警、多算法加载、低带宽上传等能力,广泛应用于安全生产、智慧园区、工业检测等场景,实现AI能力下沉与智能化快速升级。
728 1
|
消息中间件 Windows
Windows安装RabbitMQ的时候出现Plugin configuration unchanged
Windows安装RabbitMQ的时候出现Plugin configuration unchanged
704 0
Windows安装RabbitMQ的时候出现Plugin configuration unchanged
|
数据采集 监控 网络协议
基于aiohttp的高并发爬虫实战:从原理到代码的完整指南
在数据驱动时代,传统同步爬虫效率低下,而基于Python的aiohttp库可构建高并发异步爬虫。本文通过实战案例解析aiohttp的核心组件与优化策略,包括信号量控制、连接池复用、异常处理等,并探讨代理集成、分布式架构及反爬应对方案,助你打造高性能、稳定可靠的网络爬虫系统。
970 0
|
机器学习/深度学习 人工智能 监控
利用AI进行代码审查:提升代码质量和开发效率
【10月更文挑战第12天】本文探讨了AI在代码审查中的应用及其优势,介绍了AI辅助代码审查工具如何通过自动化和持续学习提升代码质量和开发效率。文章还提供了实施AI辅助代码审查的具体步骤和实战技巧,帮助团队更好地利用这些工具。
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
921 0
Redis大Key问题如何排查?如何解决?

热门文章

最新文章