C# SqlDependency尝试使用log4net执行某些操作,但启动失败

C# SqlDependency尝试使用log4net执行某些操作,但启动失败,c#,asp.net,.net,sql-server,sqldependency,C#,Asp.net,.net,Sql Server,Sqldependency,我们正在.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.GetObj

我们正在.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有任何关系?

我认为仍然存在一个未解析的类型,导致未将
NullReferenceException-对象引用设置为对象的实例。

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

Server stack trace: 
   at System.Object.GetType()
   at log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(SerializationInfo info, StreamingContext context)
我猜
log4net
也在使用外部程序集引用,因此请尝试使用Fuslogvw.exe解析它(
log4net

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

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

因为它有痕迹


我猜您会遇到这种情况,它会影响log4net,Version=2.0.8

您的连接字符串是什么。连接字符串中可能有一些错误1)服务器名称错误(或没有到服务器的路由)2)数据库实例错误3)凭据错误或不允许访问数据库4)默认数据库错误我非常确定连接字符串中的所有内容都是正确的。该问题只是间歇性出现,我们使用连接字符串进行其他操作,它可以正常工作。是否有群集(多个服务器共享一个数据库)?否,它是一台机器。有不同的应用程序使用数据库,但只有一个应用程序使用SqlDependency。您可以在try/catch中包装
SqlDependency.Start
,以独立于log4net记录异常详细信息,直到解决日志记录问题。我们只能猜测
Start
失败的原因,没有例外详细信息。间歇性错误可能是数据库连接错误或在创建基础Service Broker对象管道过程中出现问题。如果程序集是动态加载的,如*.config中所定义,
Fuslogvw
将不会显示它。如果是这样,请检查与
log4net
相关的所有*.config,并查找任何外部程序集引用。