对于使用旧版COM对象的.NET 2.0 Web服务,我遇到了一些奇怪的行为。这是场景:
有2个客户端应用程序,第一个应用程序在收到更新通知时调用我的Web服务。第二个应用程序轮询并从我的Web服务检索记录,使用我的Web服务来识别是否需要更新,然后再次调用Web服务以删除已处理的记录。如果记录需要更新,第二个告诉第一个更新的内容,第一个应用程序触发事件,而事件又调用我的Web服务。
在这里分解它的样子。 申请#2:
client.Records <- WebService.GetRecords()
for each record in Records
client <-> WebService.IdentifyRecord(record)
Notify Application #1 that it's time to call my web service.
client -> DeleteRecord()
申请#1: 从Application#2获取通知并调用WebService.PerformUpdates(...)
所以这一切都可以并行发生。也就是说,我们可以在PerformUpdates方法执行时移动到下一条记录。
很抱歉长篇大论的设置说明(我知道这很复杂,我在这件事上没有发言权)......这就是问题所在: 我的IdentifyRecord和PerformUpdates方法调用COM组件,后者又使用ADODB.Recordset。在我的日志记录中,我注意到有多个异常被抛出,但不是每个记录,可能是10个记录中的1个将抛出异常。异常发生在COM组件中(遗憾的是,我无法获取源代码,因此更改它是不可能的)。有时它是记录集的BOF / EOF错误,有时它是NULL引用错误。当我查看堆栈跟踪时,会发生真正的奇怪现象。让我们说这是我的代码:
adodbRecordSet.MoveFirst()
while not (adodbRecordSet.Eof)
rowInDataTable = myDataTable.NewRow()
rowInDataTable.BeginEdit()
rowInDataTable("ID") = adodbRecordSet.Fields("ID").Value
rowInDataTable("Name") = adodbRecordSet.Fields("Name").Value
rowInDataTable("Address") = adodbRecordSet.Fields("Address").Value
--> rowInDataTable("OtherInfo") = adodbRecordSet.Fields("OtherInfo").Value <-- HERE is where the exception occurs!!!
rowInDataTable("YetMoreInfo") = adodbRecordSet("YetMoreInfo")
rowInDataTable.EndEdit()
adodbRecordset.MoveNext()
myDataTable.AddRow(rowInDataTable)
next
在NULL对象异常的情况下,它发生在Fields集合中。
我不禁想到,如果它确实是EOF / BOF错误或其他什么,那么它会在第一行显示出来(“ID”)?
所以,我可以假设,COM和网络服务的并行调用正在发生。如果我连续调用Web服务(每个方法接一个),它就像一个冠军。但是,如果客户端使用该事件调用Web服务,则会发生这种情况。
任何人都可以了解发生的事情???
谢谢!
答案 0 :(得分:1)
如果您正在与来自ASP.NET的COM进行交互,则需要了解与您交互的组件的COM线程模型。 Here's an article with some useful info
请注意,无论您的COM组件声称支持哪种线程模型,这只是开发人员的断言。多线程很难,许多传统的COM组件都没有做好。
如果您无法访问COM组件的源代码或支持,则可能不得不求助于使用锁定来序列化访问。