LINQ to SQL:包含在TargetInvocationException中的间歇性AccessViolationException

几周以来,我们正在使用ASP.Net Web应用程序遇到W3WP崩溃问题。 这些是在我们的网络服务器更新后开始的。 我们的申请没有变化,并且多年来一直稳定。
我们的情况似乎与之前的问题非常相似。 这个问题也可能有关系,但在我们的例子中,查询在99.9%的时间内运行良好。

我们使用了大量未编译的LINQ查询,并尝试编译它们可以防止这些崩溃。 崩溃次数急剧减少,但仍然会发生。

将我们的查询包装在try catch然后捕获TargetInvocationException也不起作用。 没有抓住exception。

发生崩溃时,我们会收到WER报告并可以检索崩溃转储。
来自转储的堆栈跟踪对于未编译的查询通常如下所示:

at System.RuntimeMethodHandle.InvokeMethod(Object target,Object [] arguments,Signature sig,Boolean constructor)
在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments)
在System.Delegate.DynamicInvokeImpl(Object [] args)
在System.Data.Linq.SqlClient.QueryConverter.VisitInvocation(InvocationExpression invoke)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
在System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
在System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)
在System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression谓词)
在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression谓词)
在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.VisitSelect(表达式序列,LambdaExpression选择器)
在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.VisitDistinct(表达式序列)
在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
在System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式节点)
在System.Data.Linq.SqlClient.SqlProvider.BuildQuery(表达式查询,SqlNodeAnnotations注释)
在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式查询)
在System.Data.Linq.DataQuery’1.System.Collections.Generic.IEnumerable.GetEnumerator()
在System.Linq.Buffer’1..ctor(IEnumerable’1 source)
在System.Linq.Enumerable.ToArray [TSource](IEnumerable’1 source)

来自转储的堆栈跟踪用于编译查询,如下所示:

在System.RuntimeMethodHandle.InvokeMethod(System.Object,System.Object [],System.Signature,Boolean)
在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object,System.Object [],System.Object [])
在System.Delegate.DynamicInvokeImpl(System.Object [])
在System.Data.Linq.SqlClient.SqlProvider.AssignParameters(System.Data.Common.DbCommand,System.Collections.ObjectModel.ReadOnlyCollection`1,System.Object [],System.Object)
在System.Data.Linq.SqlClient.SqlProvider.Execute(System.Linq.Expressions.Expression,QueryInfo,System.Data.Linq.SqlClient.IObjectReaderFactory,System.Object [],System.Object [],System.Data.Linq .SqlClient.ICompiledSubQuery [],System.Object)
在System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(System.Linq.Expressions.Expression,QueryInfo [],System.Data.Linq.SqlClient.IObjectReaderFactory,System.Object [],System.Data.Linq.SqlClient.ICompiledSubQuery [])
在System.Data.Linq.SqlClient.SqlProvider + CompiledQuery.Execute(System.Data.Linq.Provider.IProvider,System.Object [])
在System.Data.Linq.CompiledQuery.ExecuteQuery(System.Data.Linq.DataContext,System.Object [])

有谁知道什么可能改变了我们的应用程序的行为? 我们知道它是“更新”(但不完全是哪一个),但我们对它的技术背景更感兴趣。
当然,我们也欢迎一种解决方案来防止我们的应用程序崩溃。

我想我会发布一个解决方案,我们发现这个问题,因为我们最近开始遇到这个问题。

我们有很多服务器运行我们的代码就好了但是每次只有1次因为这个错误而崩溃了几次。 我相信这台服务器是在.net 4.5.2上。

我们向微软开了一张票,因为他们的堆栈中发生了未处理的exception。

他们看着我们的垃圾场,然后带着这个解决方案回来了。

https://support.microsoft.com/en-us/kb/3139544上提供了一个新的修复程序

如果你转到.net 4.6.1会更好

我希望这个解决方案可以帮助其他人发现自己正在阅读这个。

很难说没有看到你的任何Linq代码但是我冒昧地猜测它是你正在使用的linq库的内部(转换)错误。

如你所说,你最近升级了
(您从哪个.NET版本升级到?)

我有类似的问题,通过安装Windows更新解决,你说你做了一些成功的结果?

尝试识别导致错误的用户输入。 尝试自己处理投射,而不是依靠Linq