1

在过去的两年中,我们一直在使用 ASP.NET MVC 3、NHibernate (v. 3.3.1.4000) 和用于后端数据库的 PostgreSql 开发基于 Web 的应用程序,因此使用 Npgsql 驱动程序 (v. 2.0.12.0)。该系统已在 4 个不同的客户端服务器上成功利用,并且从未出现我在我们最近设置的新服务器上遇到的错误。该异常仅在最初填充数据时发生过一次,并阻止某些业务实体存储到数据库中。我真的必须确保将来正确处理错误,如果根本不可能避免,但不知如何。一般在网站和互联网上搜索此错误或类似错误并没有产生任何信息。你们有没有人遇到过这个问题或知道如何解决它?谢谢 :)

这是错误:

System.NotSupportedException: This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)
   at Npgsql.NpgsqlSync.WriteToStream(Stream outputStream)
   at Npgsql.NpgsqlReadyState.SyncEnum(NpgsqlConnector context)
   at Npgsql.NpgsqlState.Sync(NpgsqlConnector context)
   at Npgsql.ForwardsOnlyDataReader.GetNextResponseObject()
   at Npgsql.ForwardsOnlyDataReader.GetNextRowDescription()
   at Npgsql.ForwardsOnlyDataReader.NextResult()
   at Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean synchOnReadError)
   at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery()
   at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
   at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
   at NHibernate.Action.EntityInsertAction.Execute()
   at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
   at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
   at NHibernate.Engine.ActionQueue.ExecuteActions()
   at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
   at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
   at NHibernate.Impl.SessionImpl.Flush()
   at NHibernate.Transaction.AdoTransaction.Commit()
4

2 回答 2

3

由于堆栈跟踪源自NHibernate.Transaction.AdoTransaction.Commit,这意味着此错误可能是由 NHibernate 本身记录的。您的应用程序必须进行自己的日志记录,以便您可以...

  • NHibernate 之外发生的错误的详细信息
  • 从 NHibernate 冒出的错误的更好上下文,例如您遇到的错误

有关实现此类日志记录的帮助,请参阅“记录所有未处理的应用程序错误”和“异常处理不应隐藏问题”。

如果没有有关生成此错误的代码的更多信息,这几乎是不可能修复的。在使用新代码库时,修复日志记录和异常处理代码需要成为首要任务之一,以便真正有机会修复错误和改进代码。

于 2013-11-12T17:07:27.133 回答
0

这似乎是 Npgsql 中的一个错误。

根据堆栈跟踪(并检查 Npgsql 代码:https ://github.com/npgsql/Npgsql/blob/master/src/Npgsql/NpgsqlDataReader.cs#L1163 ),当 GetNextResponseObject() 内部发生错误时,Npgsql 发送一个将消息同步到服务器以将对话重置为一致状态。问题是,当这个错误发生时,一些数据可能已经留在流中,当 Npgsql 尝试写入它时,缓冲流检查是否还有数据,并且在刷新数据时,尝试调用 seek 这是' t 受网络流支持(在其上创建缓冲流)。

此错误的一个可能修复方法是在写入之前从任何可能留下的数据中刷新缓冲流。

我将使用此更改创建一个拉取请求。

正如您所注意到的,最大的问题是这种类型或错误非常罕见。此错误仅对您发生一次。我需要更多地调查导致异常首先抛出的原因。

我希望它有所帮助。

于 2013-11-16T02:14:22.823 回答