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

 

posted @ 2019-05-17 15:35  邑尘  阅读(710)  评论(0编辑  收藏  举报