MARS TDS 标头包含错误 - ASP.NET Core + EF Core 2.1.4 + Azure SQL Server

10
我有一个ASP.NET Core应用程序[Microsoft.AspNetCore.App 2.1.4],带有EF Core 2.1.4 [启用DbContext池化]和存储在Azure SQL数据库中的数据。
偶尔[每1-2天一次],我会遇到无法恢复的错误,指出System.Data.SqlClient.SqlException(0x80131904):传入的表格数据流(TDS)协议流不正确。MARS TDS头包含错误。
一旦我重新启动应用程序,一切都会恢复正常,直到再次发生。
可能需要注意的是,我的连接字符串中根本没有启用MultipleActiveResultSets,这使问题变得更加奇怪。
是否有其他人注意到类似的情况?有没有办法跟踪问题?
堆栈跟踪:
System.Data.SqlClient.SqlException (0x80131904): The incoming tabular data stream (TDS) protocol stream is incorrect. The MARS TDS header contained errors.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementation[TState,TResult](Func`3 operation, Func`3 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
   at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Inviton.Web.Portal.Controllers.EventListController.GetEvents(BL bl, Int32 venueId, Int32 promoterId) 
   ---snip---

嗨,阿尔贝托,我已经明确设置了 MultipleActiveResultSets=False,但仍然是同样的问题。我已经执行了你建议的查询。请问在哪里可以看到连接是否正在使用 MARS? - Bruno Laurinec
请参考此文档 https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-connections-transact-sql?view=sql-server-2017。阅读有关“net_transport”和“parent_connection_id”列的文档。 - Alberto Morillo
你是正确的。 - Alberto Morillo
我们遇到了相同的问题。可能与此相关:https://github.com/dotnet/corefx/issues/32752 - SepehrM
@bruno-laurinec,你可以分享一下你所做的解决方法的代码吗? - Madhav Shenoy
显示剩余11条评论
2个回答

2

3
已修复于SqlClient 1.1.2版本(https://www.nuget.org/packages/Microsoft.Data.SqlClient/1.1.2),发布日期为4月15日。 - Calax
@Calax,那是Microsoft.Data.SqlClient,OP正在使用System.Data.SqlClient。 - David Klempfner
根据 https://github.com/dotnet/SqlClient/issues/85,System.Data.SqlClient 在版本4.8.2中已经修复。 - Joe Newton

0
这对我有效:
右键单击您的项目 -> 管理 nuget 包 -> 更新。
将 Microsoft.Data.SqlClient 更新为最新版本。

OP正在使用System.Data.SqlClient,而不是Microsoft.Data.SqlClient。 - David Klempfner
1
你说得对,我没注意到。我是通过谷歌搜索进入这里的,所以这可能对其他遇到同样问题的人有所帮助。 - RonaldPaguay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接