• 不知道是否是wcf 的一个bug


    最近使用wcf ,主要参考Artech的文章,有一个解决不了的问题,为了更好的说明问题,先简单介绍一下。wcf服务寄宿于winform,使用TcpBinding 双工通信。界面如下:

    创建ServiceHost服务的方法CreateHost()如下,ServiceTypeElement为自定义读配置文件的方法,参考自http://www.cnblogs.com/artech/archive/2011/12/07/batching-hosting.html 

    Proxy为自定义的用于读取配置文件中IP地址、域名、端口等的实体类

     private ServiceHost CreateHost(ServiceTypeElement e)
     {
                string address = proxy.UseLocal.Value ? proxy.IPAddress : proxy.DomainName;
    
                ServiceHost host = new ServiceHost(e.ServiceType, new Uri(string.Format("net.tcp://{0}:{1}", address, proxy.NetPort)));
                NetTcpBinding myBinding = new NetTcpBinding();
                myBinding.Security.Mode = SecurityMode.None;
                host.AddServiceEndpoint(Type.GetType(e.Contract, false), myBinding, e.Name);
                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                {
                    ServiceMetadataBehavior metaData = new ServiceMetadataBehavior();
                    metaData.HttpGetEnabled = e.HttpGetEnabled;
                    metaData.HttpGetUrl = new Uri(string.Format("http://{0}:{1}/{2}", address, int.Parse(proxy.NetPort) + 1, e.Name));
                    host.Description.Behaviors.Add(metaData);
                }
                Uri exchangeUri = new Uri(string.Format("net.tcp://{0}:{1}/mex{2}", address, proxy.NetPort, e.Name));
                host.AddServiceEndpoint(typeof(System.ServiceModel.Description.IMetadataExchange), myBinding, exchangeUri);
    
                return host;
    }
    

     批量启动wcf 服务的方法如下,而解决不了的问题就是发生这里。这个方法和CreateHost()在一个继承Collection<ServiceHost>类中

    /// <summary>
    /// 启动服务
    /// </summary>
    public void Open()
    {
         foreach (ServiceTypeElement element in settings.ServiceTypes)
         {
               string address = proxy.UseLocal.Value ? proxy.IPAddress : proxy.DomainName;//判断用本地IP还是动态域名
               ServiceHost host = this.CreateHost(element);
               try
                 {
       //open()异常执行的方法,重新创建一个新的对象 host.Faulted += new EventHandler((eventSender, eventArgs) => { host.Abort(); host = new ServiceHost(element.ServiceType, new Uri(string.Format("net.tcp://{0}:{1}", address, proxy.NetPort))); host.Open(); }); host.Open(); this.Add(host);//启动成功添加到集合 } catch { host.Abort(); } IsStart = true;//标记服务启动 }

     上面的方法,在异常处理中执行Abort()方法用以释放资源和销毁对象。

      引用问题,输入一个错误的IP地址,然后启动服务,发生异常如下

    由于是异常所以执行catch中的Abort以销毁host   (不知道是否真的销毁了),因为该对象启动不成功所以没有添加到Collection集合中

    好了,然后把地址改为正确定的,再启动服务,监视host的值如下,没有任何问题。

    问题是运行的结果,跟错误IP地址时的一样,如下。说明一下,如果程序刚启动设置的IP地址是正确,则启动wcf服务没有任何问题,然后改为动态域名再启动服务也完成没有问题。很郁闷,本来是发生博问中的,但博问的流量少。希望有朋友提供一下方法,没有理由设错一个IP地址就重新启动应用程序。

  • 相关阅读:
    Keras -- 词向量 CNN
    KUDU实时分析
    Keras
    Kalfka
    Linux云
    管理KUDU
    列存储与行存储
    算法笔记 第5章 入门篇(3) --数学问题 学习笔记
    算法笔记 上机训练实战指南 第4章 入门篇(2) --算法初步 4.6two pointers 学习笔记
    算法笔记 上机训练实战指南 第4章 入门篇(2) --算法初步 4.4贪心 学习笔记
  • 原文地址:https://www.cnblogs.com/feng84/p/3150563.html
Copyright © 2020-2023  润新知