求助大神帮忙!问题可能有点长、请耐心看完再回答、多谢
使用WCF服务作为客户端去连接另外一个WCF服务、这两个服务都是用Windows服务承载的、然后作为客户端的那个WCF服务连接另外一个WCF服务、使用它提供的任何服务都是没问题的、同时那个作为客户端的WCF服务里面有个线程一直监视着另外一个WCF服务、如果发现它挂掉了、就会立即自动去启动它、
发现那个WCF服务挂掉然后去启动它是没问题的、之后重新client.open()也没问题、到这里问题就来了、我再次使用那个WCF提供的服务时就会报错了、说通道处于出错状态、现在我初步怀疑是WCF服务重启后、上一次连接的通道没关闭、而第二次client.open()连接后会产生两个通道、但是我去调用WCF提供的服务时它使用的是第一次的通道、所以会报这种错误!后来我在那个线程监视里做了处理、第二次连接之前就已经把第一次的通道给client.close()关闭了、但是问题依然没解决、快奔溃了、求大神!!!!!!错误提示“
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。”wcf通讯Channels
使用WCF服务作为客户端去连接另外一个WCF服务、这两个服务都是用Windows服务承载的、然后作为客户端的那个WCF服务连接另外一个WCF服务、使用它提供的任何服务都是没问题的、同时那个作为客户端的WCF服务里面有个线程一直监视着另外一个WCF服务、如果发现它挂掉了、就会立即自动去启动它、
发现那个WCF服务挂掉然后去启动它是没问题的、之后重新client.open()也没问题、到这里问题就来了、我再次使用那个WCF提供的服务时就会报错了、说通道处于出错状态、现在我初步怀疑是WCF服务重启后、上一次连接的通道没关闭、而第二次client.open()连接后会产生两个通道、但是我去调用WCF提供的服务时它使用的是第一次的通道、所以会报这种错误!后来我在那个线程监视里做了处理、第二次连接之前就已经把第一次的通道给client.close()关闭了、但是问题依然没解决、快奔溃了、求大神!!!!!!错误提示“
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。”wcf通讯Channels
解决方案 »
- C# 如何给 Exchange2010 添加与删除邮件账户
- Tables[0].Rows.Count和Tables[0]. Columns.Count区别
- WebClient提交出现:基础连接已关闭 接收时发生错误
- 水晶报表 ERROR: 索引超出范围。必须为非负值并小于集合大小。参数名: index
- 急!!在线等,同一条SQL在程序里运行查出一条数据,在数据库里查询可以查出多条,为什么呢?
- Reflection的疑惑,请C#的高手指教,我是用Java的,感觉C#在这点上没Java好用
- 关于as的用法
- 发现网上一些导出csv的方法好像不支持框架
- 请教一个C#处理xml的问题
- 如何用C#实现像.NET集成开发环境一样的菜单和工具条呀!
- 弹出窗口返回父窗口控件值的问题,就这点分了全数奉上
- c#如何定制任务
LZ是依据什么来判断的?client对象的连接状态还是目标WCF服务的进程?
重新启动服务后,用其他的工具测试一下那个服务是否可用
我被搞晕了
双工通讯中、我们的win form客户端如果是用UI的线程去open
那么如果想要close的话必须得开另外一个线程去close
因为回调是一直占用着通道的、所以close的信息不能返回
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]
我不知道你的委托回调是不是在后台线程中工作的,如果是的话,不会阻塞当前线程进行Close的,另外WCF也内部提供了异步操作的方法,可以查看Silverlight中的WCF的写法,完全是异步模式的。
如果客户端通过最简单的TCP连接到服务器,为了保证当前连接可用,必须定时发送心跳包,如果不这样做,中间即使发生断网的情况都不会被发现,只有在数据传输过程中,不能顺利到达才被认为是连接断开了。如果我改为轮询服务器是否有通知下来,效果也一样,而带来的好处是我不需要为了各种连接断开而烦恼了。除非网络条件非常好(内网),同时需要有高速的响应,且做好了消息队列,处理发送失败的消息重发,否则还不如定时轮询服务器更实在。
问题解决了、是线程阻塞了
针对问题说明下、由于项目的特殊性、服务必须24小时开着、而整个项目中服务的个数还是很多的、每个WCF服务作为服务的同时它也是其他服务的客户端、各个服务之间是要时刻进行通讯着的、所以需要的时候才连接这不现实、所以只能通过一些方法去保持每时每刻都是连接的、最重要的是我们是千兆网络的内网、服务不会对外公布、所以负荷还不是很大
话说分析到这地步真的很牛B啊、啥时候我也能像你们这样
上面说到的轮询服务器、是什么来的、能详细说下么、什么是轮询
这些我都已经知道了想听听像我这种情况的、不用WCF去实现、
还有别的解决方案么
找到最简洁的解决办法了、只需在客户端加上
[CallbackBehavior(UseSynchronizationContext = false)]
这句就可以了、理论没错、但一开始方向就错了
WCF作为微软的三大核心技术之一、所有可能的情况应该都会提供了解决方法、
只是我们不知道而已、个人猜想的虽然问题是自己解决的、但你说的蛮中肯的、就结贴给分了吧