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