Подтвердить что ты не робот

LINQ to SQL: прерывистый AccessViolationException, завернутый в TargetInvocationException

С нескольких недель мы сталкиваемся с W3WP-авариями с нашим веб-приложением ASP.Net. Они начались после обновления наших веб-серверов. Наша заявка не изменилась и была стабильной в течение многих лет.
Наша ситуация, похоже, очень похожа на этот более ранний вопрос. И этот вопрос также может быть связан, хотя в нашем случае запросы выполняются нормально в 99,9% от используемого времени.

Мы используем много несвязанных запросов LINQ и пытаемся, если их компиляция предотвратит эти сбои. Количество аварий резко сократилось, но они все еще происходят.

Также завершение наших запросов в try catch, а затем ловкость TargetInvocationException не работает. Исключение не обнаружено.

Когда происходит сбой, мы получаем WER-отчет и можем восстановить аварийный свал. Трассировка стека из дампа для несвязанного запроса обычно выглядит так:

в 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)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
в System.Data.Linq.SqlClient.QueryConverter.VisitBinary(двоичное выражение b)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
в System.Data.Linq.SqlClient.QueryConverter.VisitBinary(двоичное выражение b)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.Visit(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitWhere(последовательность выражений, предикат LambdaExpression)
в System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitWhere(последовательность выражений, предикат LambdaExpression)
в System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitSelect(последовательность выражений, селектор LambdaExpression)
в System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.VisitDistinct(последовательность выражений)
в System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
в System.Data.Linq.SqlClient.QueryConverter.VisitInner(выражение node)
в System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(выражение node)
в 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)
в System.Linq.Enumerable.ToArray [TSource] (источник IEnumerable'1)

Трассировка стека из дампа для скомпилированного запроса выглядит так:

в 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 [])

Кто-нибудь знает, что могло бы изменить поведение нашего приложения? Мы знаем, что это "обновление" (но не совсем такое), но нас больше интересует его технический фон.
Разумеется, мы также приветствовали бы решение, препятствующее сбою нашего приложения.

4b9b3361

Ответ 1

Я думал, что опубликую решение, которое мы обнаружили по этой проблеме, потому что недавно мы начали испытывать проблему.

У нас есть много серверов, которые управляют нашим кодом только штрафом, но только 1 рушится пару раз в неделю с этой ошибкой. Я считаю, что этот сервер был включен .net 4.5.2.

Мы открыли билет в Microsoft, поскольку в их стеке произошло необработанное исключение.

Они посмотрели на нашу дампу и вернулись с этим решением, которое сработало.

Новое исправление доступно на https://support.microsoft.com/en-us/kb/3139544

Лучше, если вы перейдете к .net 4.6.1

Я надеюсь, что это решение поможет кому-то еще, кто читает это.

Ответ 2

Трудно сказать, не видя ни одного вашего Linq-кода, но я бы рискнул предположить, что это внутренняя (кастинг) ошибка с библиотекой linq, которую вы используете.

Как вы упомянули, что вы недавно обновили
(с какой версией .NET вы обновлялись с и до?)

У меня была аналогичная проблема, которая была решена путем установки обновлений Windows, которые, как вы говорите, вы сделали с некоторым успешным результатом?

Попробуйте определить пользовательские входы, которые вызывают ошибку. Попытайтесь обработать литье себя, а не полагаться на Linq