【问题标题】:SqlDependency tries to do something with log4net and fails to startSqlDependency 尝试使用 log4net 做某事并且无法启动
【发布时间】:2020-05-27 10:34:31
【问题描述】:

我们在 .NET Web 应用程序中使用 SqlDependency。在生产环境中,我们在尝试调用 Start 时会收到以下错误:

NullReferenceException - Object reference not set to an instance of an object.
Server stack trace: 
   at System.Object.GetType()
   at log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(SerializationInfo info, StreamingContext context)
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
   at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage..ctor(IMethodCallMessage mcm)
   at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage.SmuggleIfPossible(IMessage msg)
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)
Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at SqlDependencyProcessDispatcher.StartWithDefault(String connectionString, String& server, DbConnectionPoolIdentity& identity, String& user, String& database, String& service, String appDomainKey, SqlDependencyPerAppDomainDispatcher dispatcher, Boolean& errorOccurred, Boolean& appDomainStart)
   at System.Data.SqlClient.SqlDependency.Start(String connectionString, String queue, Boolean useDefaults)

启动SqlDependency的代码很简单:

SqlDependency.Start(ConnectionStringHelper.GetDatabaseConnectionString(), null);

log4net 从 v1 升级到 v2 后首次出现该错误。我们还收到了一个与 SqlDependency 无法找到 log4net DLL 相关的类似错误,我们通过手动将 DLL 复制到 C:\Windows\system32\inetsrv\ 来纠正该错误。

SerializationException - Unable to find assembly 'log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.
Server stack trace: 
   at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.DeserializeObject(MemoryStream stm)
   at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage.FixupForNewAppDomain()
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)
Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at System._AppDomain.CreateInstance(String assemblyName, String typeName)
   at System.Data.SqlClient.SqlDependency.CreateProcessDispatcher(_AppDomain masterDomain)
   at System.Data.SqlClient.SqlDependency.ObtainProcessDispatcher()
   at System.Data.SqlClient.SqlDependency.Start(String connectionString, String queue, Boolean useDefaults)

为什么 SqlDependency 与 log4net 有任何关系?

【问题讨论】:

  • 你的连接字符串是什么。连接字符串中可能有一些错误 1) 服务器名称错误(或没有到服务器的路由) 2) 数据库实例错误 3) 凭据错误或不允许访问数据库 4) 默认数据库错误
  • 我很确定连接字符串中的一切都是正确的。该问题只是间歇性出现,我们将连接字符串用于其他事情并且它可以工作。
  • 你有集群吗(多台服务器共享一个数据库)?
  • 不是,是单机。有不同的应用程序使用数据库,但只有一个应用程序使用 SqlDependency
  • 您可以将 SqlDependency.Start 包装在 try/catch 中,以独立于 log4net 记录异常详细信息,直到找出日志记录问题。我们只能猜测为什么Start 会失败而没有异常详细信息。间歇性错误可能是数据库连接或在创建底层 Service Broker 对象管道期间出现的问题。

标签: c# asp.net .net sql-server sqldependency


【解决方案1】:

我认为还有一个未解决的类型会导致NullReferenceException - Object reference not set to an instance of an object.

stacktrace 中的最后两条语句表示:

Server stack trace: 
   at System.Object.GetType()
   at log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(SerializationInfo info, StreamingContext context)

我的猜测是log4net 也在使用外部程序集引用,因此请尝试使用 Fuslogvw.exe - https://docs.microsoft.com/en-us/dotnet/framework/tools/fuslogvw-exe-assembly-binding-log-viewer 解决它(log4net

如果引用的另一个程序集弹出,请将其复制到C:\Windows\system32\inetsrv\

【讨论】:

  • 如果程序集是动态加载的,如 *.config 中所定义,Fuslogvw 将不会显示它。如果是这样,请检查与 log4net 相关的所有 *.config 并查找任何外部程序集引用。
【解决方案2】:

SqlDependency.Start 时 log4net 为什么会抛出错误的解释 被称为

因为它运行 Traces internally

我猜你遇到了这个issue,它会影响 log4net,Version=2.0.8

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 2016-02-23
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多