在Web服务中使用COM组件进行的奇怪的事情

时间:2011-11-21 16:25:39

标签: .net web-services iis com adodb

对于使用旧版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服务,则会发生这种情况。

任何人都可以了解发生的事情???

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您正在与来自ASP.NET的COM进行交互,则需要了解与您交互的组件的COM线程模型。 Here's an article with some useful info

请注意,无论您的COM组件声称支持哪种线程模型,这只是开发人员的断言。多线程很难,许多传统的COM组件都没有做好。

如果您无法访问COM组件的源代码或支持,则可能不得不求助于使用锁定来序列化访问。