zoukankan      html  css  js  c++  java
  • WCF服务部署后异常的处理

      在部署项目的时候,发现WCF总是存在问题,一直没找出什么原因。

       开始在项目开发阶段客户端调用WCF服务的代码如下

      

    JSAJService.JSAJServiceClient _ajService = new JSAJService.JSAJServiceClient();
     bool IsCurrent = _ajService.IsCurrentEmpty(ID,User);
    

      或者在本调用文件类中定义一个全局的WCF客户端实例服务。

     其实这样使用看起来是没什么问题的,而且也能顺利使用,在项目开发阶段完全没出现什么问题。不过,由于wcf客户端都有一个超时时间,可能静止过了一段时间,你在界面刷新数据的时候,你会发现出现下面的错误:"通信对象System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。",当然还有可能出现另外的其他的奇怪的错误提示。

    这种调用方式的确存在问题,那么有人也许会这样来调用,当然我们项目中也存在这样的调用实例。

                using (InputModelService.InputModelServiceClient _sc = new InputModelService.InputModelServiceClient())
                {
                    MD_InputEntity _ret = _sc.GetNewEntityData(ID);
                    return _ret;
                }
    

     但是这样调用也是存在问题的,还好微软给我们提供了一个建议的方法

    try
    {
        ...
        _sc.Close();
    }
    catch (CommunicationException e)
    {
        ...
        _sc.Abort();
    }
    catch (TimeoutException e)
    {
        ...
        _sc.Abort();
    }
    catch (Exception e)
    {
        ...
        _sc.Abort();
        throw;
    } 
    

     但如果调用频繁,这样实在不雅,管理也非常难受。有没有更好的方式,避免出错,又能够正确调用wcf客户吗,当然有,下面这样方式就是比较好的一种解决方案,经过实际测试,效果不错。

    创建一个辅助类

        public static class WcfExtensions
        {
            public static void Using<T>(this T client, Action<T> work)
                where T : ICommunicationObject
            {
                try
                {
                    work(client);
                    client.Close();
                }
                catch (CommunicationException e)
                {
                    client.Abort();
                }
                catch (TimeoutException e)
                {
                    client.Abort();
                }
                catch (Exception e)
                {
                    client.Abort(); throw;
                }
            }
        }

    然后客户端调用的时候即可这样来调用

                MD_InputEntity _ret = new MD_InputEntity();
                new InputModelService.InputModelServiceClient().Using(channel =>
                {
                    _ret= channel.GetNewEntityData(Params, ModelName, RequestUser);
                });
                return _ret;
  • 相关阅读:
    CoreOS Hyper-V 安装
    RancherOS Hyper-V 安装
    Android sdk content loader 0%的解决方案
    在launcher隐藏应用图标[大杂烩]
    RTSP、HTTP、HTTPS、SDP四种协议详解
    Webview上下滑动渐变色问题解决
    调节listview的item高度
    软键盘消失有残影 不影响activity原有布局 不会重绘之前界面
    android横竖屏禁止重新绘制的方法
    去除actionbar的左侧图标
  • 原文地址:https://www.cnblogs.com/aehyok/p/2955379.html
Copyright © 2011-2022 走看看