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>
------解决方案--------------------
服务器上的服务文件是不是被删除了?