WCF宿主程序自动退出

dingwei 2015-02-03 03:32:40
最近做了个net.tcp协议的WCF双工服务,宿主程序(Console或者WPF)老是自动退出。不知道什么原因,希望各位能给分析分析。
...全文
271 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-02-04
  • 打赏
  • 举报
回复
引用 17 楼 dingwei 的回复:
[quote=引用 11 楼 wyd1520 的回复:] 常见的导至整个程序自动退出的原因主要是WCF内部 连接或接收据出现了异常。双工情况下最常见,特别是服务端在发送给客户端数据时,客户端突然掉线此时WCF内部发送取不到这个这个客户端对像了。出现了异常导至整个控制台自动退出了,这种异常不容易捕获。我们也在用WCF双工模式,跟你碰到一样的问题,现在解决方式是,我们弄了一个监控程序,去刷这个WCF服务进程,如果这个进程不存在自动启动这个WCF服务,网络上还有另一种方式是用程序域来做,把整个WCF 运行在一个域里,如果域异常也是自动重启这个域。
如果在服务器回调客户端的时候加一个try{callback.Invoke();} catch{},即使客户端掉线,控制台也不会退出了。这个我反复测试过,可以解决客户端掉线导致宿主程序异常退出。 但现在还有异常关闭的情况(比之前的频率要低),说明还有其他的原因,只是还没有找到...[/quote] 你在处理罗辑部份加这个try只能防的注业务部份的代码的异常,但防不住Wcf内部封装的异常,这这个我们也是这样处理的。 这种异常也是少见,但就是无去捕获。
dingwei 2015-02-04
  • 打赏
  • 举报
回复
引用 11 楼 wyd1520 的回复:
常见的导至整个程序自动退出的原因主要是WCF内部 连接或接收据出现了异常。双工情况下最常见,特别是服务端在发送给客户端数据时,客户端突然掉线此时WCF内部发送取不到这个这个客户端对像了。出现了异常导至整个控制台自动退出了,这种异常不容易捕获。我们也在用WCF双工模式,跟你碰到一样的问题,现在解决方式是,我们弄了一个监控程序,去刷这个WCF服务进程,如果这个进程不存在自动启动这个WCF服务,网络上还有另一种方式是用程序域来做,把整个WCF 运行在一个域里,如果域异常也是自动重启这个域。
如果在服务器回调客户端的时候加一个try{callback.Invoke();} catch{},即使客户端掉线,控制台也不会退出了。这个我反复测试过,可以解决客户端掉线导致宿主程序异常退出。 但现在还有异常关闭的情况(比之前的频率要低),说明还有其他的原因,只是还没有找到...
dingwei 2015-02-04
  • 打赏
  • 举报
回复
非常感谢各位能给我细心的分析。 这个bug真不好重现,测试了软件的所有操作,都不会引起宿主程序退出,但是下班回家,第二天早上来到一看服务器程序就被关闭了,所以找了很久也没找出原因,这个现象不是很频繁,有时1天2、3次,有时几天也不出现1次。 关于日志,我是在很多关键代码都加了的,尤其是在catch的地方。一般只要能catch住异常,我都不会让它抛出去,所以能catch到的地方也不会引起主进程的异常关闭。 我问的WCF日志怎么加,其实是想问WCF有什么关键的地方可以加一个bug日志, serviceHost.Faulted += new EventHandler(hostBiz_Faulted);这个事件能捕捉到WCF异常的消息吗?我自己测试一下吧先... 非常感谢wyd1520兄弟给分享的内容,监控-重启这只是个治标不治本的方法,对于实时性要求比较高的服务就不好了,比如广播系统,正在播放音乐、或者对讲任务,突然服务关闭了,虽然能够重启,但这些正在执行的任务是无法恢复的.所以还是再努力找问题吧...
  • 打赏
  • 举报
回复
引用 9 楼 dingwei 的回复:
弱弱的问一下,BUG 日志怎么加,不要鄙视我
就是写一个这样的代码
System.IO.File.AppendAllText("log.txt", string.Format("{0} -----执行到 void test1( {1},{2})\r\n\r\n", DateTime.Now, x, a));
当然也可以使用条件编译开关让它只在 Debug 下执行。
  • 打赏
  • 举报
回复
注意不要过度猜测,不要在一些代码行上胡乱设置断点、日志。应该反复考虑测试,最后明确发现某几行代码抛出异常了,才开始调试。 从你的描述中,发现你总是定性地去假设什么理论造成程序崩溃。这时候就要想想“我是谁啊?我怎么就能靠理论就知道哪行出错啊?”,你要通过7、8次逐步缩小范围的方法来找到准确的异常代码行,千万不要让try..catch之类的转移bug的代码把你带到沟里去。
  • 打赏
  • 举报
回复
首先,你需要能够手工重复出来出错的操作方法。确保有70%以上的概率你能够让服务端垮掉。这是先决条件。如果你说“老是自动退出。不知道什么原因”,那你手工重现过问题吗? 其次,在没有 try...catch 的 Debug环境下运行服务端程序,让服务器端的bug尽早地被vs调试器捕获异常。不要采用任何隐瞒bug的try...catch,因为这只会让调试器无法捕获出错代码行,没有什么好处。 如果通过1似的你可以把问题缩小到一个小范围,但是你反复进行手工测试操作还是不能让vs调试器捕获到异常,那么就写一些日志。对于你手工重现bug所能够测试到的那一小部分代码,可以插入step1、step2、step3.....这样的日志。直到找到具体的某一条语句有异常。 写try...catch也好,还是另外弄个守护进程不断启动进程也好,这都是 Release 版本要做的事情。不是 Debug 版本要做的事情。谁也不会不让你正式发布的版本中容错,但是这不能解决 Debug。
本拉灯 2015-02-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/snnhoo/p/4159982.html#3096182 https://devlib.codeplex.com/SourceControl/latest#main/product/Codes/DevLib.AddIn/AddInDomain.cs https://devlib.codeplex.com/SourceControl/latest#main/product/Codes/DevLib.ServiceModel/WcfServiceHost.cs 可以用 AddInDomain 加载 WcfServiceHost , 这样wcf服务会被加载到自动创建的独立的进程中(注意不是线程),当wcf crash的时候这个独立的进程会自动重启,而且wcf的crash也不影响到主进程。 我公司的项目我就是这么解决的,有时候不是wcf自身的问题,有时候是客户端或者是wcf提供的服务里用了别的库造成的问题,没办法全部try catch住,只能把wcf加载到独立的进程中,不会影响主进程,而且crash后可以自动重启,监控都用不着了
本拉灯 2015-02-03
  • 打赏
  • 举报
回复
常见的导至整个程序自动退出的原因主要是WCF内部 连接或接收据出现了异常。双工情况下最常见,特别是服务端在发送给客户端数据时,客户端突然掉线此时WCF内部发送取不到这个这个客户端对像了。出现了异常导至整个控制台自动退出了,这种异常不容易捕获。我们也在用WCF双工模式,跟你碰到一样的问题,现在解决方式是,我们弄了一个监控程序,去刷这个WCF服务进程,如果这个进程不存在自动启动这个WCF服务,网络上还有另一种方式是用程序域来做,把整个WCF 运行在一个域里,如果域异常也是自动重启这个域。
dingwei 2015-02-03
  • 打赏
  • 举报
回复
利用WPF的Application.DispatcherUnhandledException事件也没有捕捉到异常...程序直接被关闭了 private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { var logger = new TxtLogger(); logger.Write("ServiceApp.txt", e.Exception.StackTrace); e.Handled = true; }
dingwei 2015-02-03
  • 打赏
  • 举报
回复
我在Main函数里加了个大大的try{}catch{},没有捕捉到异常,直接被关闭了,好像就是被直接杀了进程一样的。 弱弱的问一下,BUG 日志怎么加,不要鄙视我
於黾 2015-02-03
  • 打赏
  • 举报
回复
还有在回调的时候,如果恰逢客户端掉线会导致宿主程序(控制台Console)异常退出 这是必然的,客户端掉线了,socket就指向空引用了,你继续对它进行操作必然是报错了 而报错了又不处理,不就崩溃了
本拉灯 2015-02-03
  • 打赏
  • 举报
回复
BUG 日志呀。日志没有让我们猜呀。。。
於黾 2015-02-03
  • 打赏
  • 举报
回复
不行就在Main方法里整体加个try,catch,然后写日志,看到底是哪里出了问题 至少也要找到大概的原因,才好继续排查,不要靠瞎猜
於黾 2015-02-03
  • 打赏
  • 举报
回复
如果程序中出了异常不会导致宿主程序崩溃 这个说法很有问题 既然没有出任何异常,那它自己为什么崩溃了 只能说,你没有能够测试出到底什么异常使他崩溃
dingwei 2015-02-03
  • 打赏
  • 举报
回复
请教各位,是否遇到过其他的导致宿主程序异常退出的情况呢?
dingwei 2015-02-03
  • 打赏
  • 举报
回复
非常感谢Z65443344, 经测试,如果程序中出了异常不会导致宿主程序崩溃,顶多客户端调用时会超时(设定10s超时)。 还有在回调的时候,如果恰逢客户端掉线会导致宿主程序(控制台Console)异常退出,所以在回调的时候加了try catch, 但是现在还是会有宿主程序退出的现象
於黾 2015-02-03
  • 打赏
  • 举报
回复
就好像在问,老王早上出门就死了,怎么死的?
於黾 2015-02-03
  • 打赏
  • 举报
回复
遇到错误又没有加try,catch,于是就崩溃了呗 你既不知道什么情况下会退出,又没有错误信息,让人怎么猜

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧