日期:2014-05-17  浏览次数:20990 次

WCF服务不定期错误
本地测试,远程部署都完全没问题。但是运行一段时间后WCF会出现错误,提示未将对象引用错误,即对象是空的,3到5天出一次异常,
代码结构:
后台:
  public class Srv_Bas : Srv.Srv_Master, ISrv_Bas
  {
  BL_Base bl_BaseInfo;
  public Srv_Bas()
  {
  bl_BaseInfo = new BL_Base(subsystemModuleData.Bas.DBid);
  bl_BaseInfo.subsystemModuleData = subsystemModuleData;
  masterbl = bl_BaseInfo;
  }
  }

  public class Srv_Master
  {
  public DataTable getDataTable(string strSql)
  {
  if (masterbl == null)
  throw new Exception("masterbl is null");
  if (String.IsNullOrWhiteSpace(strSql))
  throw new Exception("strSql IsNullOrWhiteSpace");
  return masterbl.getDataTable(strSql);
  }
  }

前台:
  Type type = srvClient.GetType();
  try
  {
  return (DataTable)type.InvokeMember("getDataTable", System.Reflection.BindingFlags.Default
  | System.Reflection.BindingFlags.InvokeMethod, null, srvClient, new object[] { strSql });
  }
  catch (Exception _e)
  {
  string InterExceptionMsg="";
  if (_e.InnerException !=null)
  InterExceptionMsg= _e.InnerException.Message;
  throw new Exception("方法getDataTable(" + strSql + ")出错了。\r" + _e.Message + "\rInnerException:" + InterExceptionMsg);
  }

------解决方案--------------------
你导出throw异常都没事,难道就一个null异常就崩溃了?前台出错还是后台出错你自己先要确定,总不能直接把代码一贴就不管了,别人可没有环境进行调试,但看那几行代码根本没错误,更何况你也不可能给全代码。
------解决方案--------------------
既然你用的是WCF,那么为啥不用接口调用其服务,还用反射?
------解决方案--------------------
这种东西不是靠翻来覆去地“跟代码相面”而找出问题来的。

善于测试驱动开发,你每天都能随机挑选数据进行成千上万次、打乱次序、甚至多线程并发的回归测试,自然可以迅速发现能够重现其bug的数据来。

手工,或者让别人也是手工操作,去跟代码相面,我是挑不出什么问题来。
------解决方案--------------------
这种bug就自己再去花点时间从头开始吧。
------解决方案--------------------
batch="false"解决的是"未能加载文件或程序集"这样的错误。
你的问题是"未将对象引用错误",我觉得八成还是你代码的问题。

这种不定期,不是100%重现的问题不是很容易解决。
我的解决办法是,
1. 测试,写个简单测试端,开线程模拟并发,循环,做大量测试,看是否能够重现。
2. 你有CallStack,知道那个函数出的问题,在函数开始将所有参数写log,问题出现中从log取得数据,对函数进行测试。
------解决方案--------------------
看Call Stack是在你的函数中出错的吗?
------解决方案--------------------
你好我也是猜测,如果能正常运行的,现在这个wcf 调用人是不是量比较大最大链接数配置了么?
C# code
<serviceBehaviors>
                <behavior name="NetStars.Soft_SecurityPlatform.WcfService.BBsService">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling maxConcurrentCalls="10000" maxConcurrentInstances="2147483647" maxConcurrentSessions="10000" />
                </behavior>

------解决方案--------------------
服务器上的服务文件是不是被删除了?