• Core使用SAP Web Service


      .Net Core在使用SAP的Web Service会遭遇到一些错误,貌似目前并不支持SAP中的Web Service,我们需要曲线实现下调用过程:

      经测试,不再需要Framework项目中转,System.ServiceModel的几个Nuget升级到最新版即可。现在生成的代码已经有所差异了,简单的更改即可使用。

      

      

    •  使用Framework的项目来“添加服务引用”,

      

    •   找到生成目录下的Reference.cs文件并打开

    • 因该命名空间已经是SAPInterface.FAChange3下了,所以移除掉该文件中所有的"SAPInterface.FAChange3."字样。
    • 文件中我们看到有个接口与类的名称一样,这是错误的。我们给接口名称前面增加I,改为IZFAMS_AS02。

    • 修改掉以下几处应该使用接口的内容:
    •  将该文件保存并拷贝到Core项目中,修改命名空间为Core的命名空间
    • 调用该文件,示例方法:

      

    public class TransferWsR
        {
            private ZFAMS_ABT1NChannel callClient { get; set; }
            public TransferWsR()
            {
                // 创建 HTTP 绑定对象
                var binding = new BasicHttpBinding();
                binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                var appSection = IocManager.Instance.Resolve<IConfiguration>().GetSection("AppSettings");
                // 根据 WebService 的 URL 构建终端点对象
                var wsUrl = appSection["SAPWsTransferUrl"];
                var endpoint = new EndpointAddress(wsUrl);
    
    
                // 创建调用接口的工厂,注意这里泛型只能传入接口
                var factory = new ChannelFactory<ZFAMS_ABT1NChannel>(binding, endpoint);
                factory.Credentials.UserName.UserName = appSection["SAPUserName"];
                factory.Credentials.UserName.Password = appSection["SAPPassword"];
                // 从工厂获取具体的调用实例 
                callClient = factory.CreateChannel();
                callClient.OperationTimeout = new TimeSpan(0, 20, 0);
            }
    
            public TransferOutput DoTransfer(TransferInput input)
            {
                var rq = new ZFAMS_ABT1NRequest();
                var data = new ZFAMS_ABT1NInput
                {
                    IT_ABT1N = new ZST_ABT1N[]
                    {
                        AutoMapper.Mapper.Map<ZST_ABT1N>(input)
                    }
                };
                rq.ZFAMS_ABT1N = data;
                try
                {
                    var rp = callClient.ZFAMS_ABT1N(rq);
                    var result = rp.ZFAMS_ABT1NResponse.ET_RETURN.FirstOrDefault();
                    if (result == null)
                    {
                        throw new Exception("调用结果为Null!");
                    }
    
                    return AutoMapper.Mapper.Map<TransferOutput>(result);
    
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
    
            }
        }
    View Code
  • 相关阅读:
    图像的剪切
    DOS指令大全(二)
    扫描进程
    数据库名、数据库实例、全局数据库名、服务名、SID等的区别
    ORA29807: specified operator does not exist
    TCP/IP网络编程的几个网站
    漂在等待离职的日子(三)
    入职第一天
    入职一周
    漂在等待离职的日子(八)
  • 原文地址:https://www.cnblogs.com/ceci/p/10881626.html
Copyright © 2020-2023  润新知