RfcDestinationManager.UnregisterDestinationConfiguration时报错cannot unregister the given destination c...

在使用NCO访问SAP的RFC时,我的程序代码是这么写的:

        string destinationName = "EWM_700_GROUP";
        IDestinationConfiguration ID;
        RfcDestination prd;

        public EWM01()
        {
            try
            {
                ID = new MyBackendConfig();
    RfcDestinationManager.RegisterDestinationConfiguration(ID);
                prd = RfcDestinationManager.GetDestination(destinationName);//获得目的对象
            }
            catch (Exception ex)
            {
                LogService.WatchLog("初始化EWM01异常:" + ex.Message.ToString() + Environment.NewLine);
                throw ex;
                //Configuration.OnlyOne().messageService.Error(ex, "EWM01");
            }
        }

        public void Dispose()
        {
RfcDestinationManager.UnregisterDestinationConfiguration(ID);

        }    

这段代码是写在一个WebService里,从表面上看,似乎没什么问题

然而,实际上,程序大多数时候都好使,但是每天都会有几次出现这种问题,如下图:

这句话的意思是,无法注销所给的目的配置,很容易就定位到,问题出在这一句

RfcDestinationManager.UnregisterDestinationConfiguration(ID);

但是,这一句不是用来断开连接的么??然后,我就开始查资料

关于这个问题的资料基本都是国外的,国内貌似还没人回答这个问题,好在我英文也不是很差,最后,让我找到了几个有用的信息

原文地址是:https://stackoverflow.com/questions/22242451/how-to-check-whether-the-sap-system-is-connected-to-net-or-not

这个国外哥们儿告诉我,NCO使用的是连接池机制,所以我们不必自己手动去创建连接和断开连接,NCO的运行库会帮我们做

在创建一个RFC的function实例的时候,就会触发连接,总之,我们不用去管打开或者关闭连接的事,我们只需要处理那些可能在连接过程中发生的异常就好了

还有一个哥们儿,也发表了类似的观点,不过他主要是跟我们讲注册那一步的意义

原文出处:https://archive.sap.com/discussions/message/14955463#14955463

有了这两个哥们的回答,我就大概可以确定了,所谓的RfcDestinationManager.RegisterDestinationConfiguration(ID);注册

只不过是告诉RfcDestinationManager管理器,SAP那边的地址配置信息而已,真正的建立连接和断开连接跟它没有关系

既然如此,那么这个问题的解决方案就很简单了,直接去掉RfcDestinationManager.UnregisterDestinationConfiguration(ID);这句就好了

另外,为了以防万一,最好在每次注册之前,做一个判断,以免重复注册引起报错

所以,最后,经过调整后代码就是

        public EWM01()
        {
            try
            {
                ID = new MyBackendConfig();
                //如果RFC管理器中不存在指定的目的地
                if (RfcDestinationManager.TryGetDestination(destinationName) == null)
                {
                    //则向RFC管理器注册目的地配置
                    RfcDestinationManager.RegisterDestinationConfiguration(ID);
                }
                prd = RfcDestinationManager.GetDestination(destinationName);//获得目的对象
            }
            catch (Exception ex)
            {
                LogService.WatchLog("初始化EWM01异常:" + ex.Message.ToString() + Environment.NewLine);
                throw ex;
                //Configuration.OnlyOne().messageService.Error(ex, "EWM01");
            }
        }

        public void Dispose()
        {
            ////如果RFC管理器中存在指定的目的地
            //if (RfcDestinationManager.TryGetDestination(destinationName) != null)
            //{
            //    //则注销RFC管理器的目的地配置
            //    RfcDestinationManager.UnregisterDestinationConfiguration(ID);
            //}
        }

希望能对遇到同样问题的人有帮助

本文为作者原创,如需转载,请标明出处

 

转载于:https://www.cnblogs.com/mooncher/p/7359045.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值