最近使用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地址就重新启动应用程序。

 

 

 

posted on 2013-06-23 01:37  柏柏  阅读(180)  评论(0编辑  收藏  举报