【问题标题】:Accessing a thread un-safe COMobject in classic ASP在经典 ASP 中访问线程不安全的 COMobject
【发布时间】:2014-06-13 02:59:57
【问题描述】:

试图解决经典 ASP 应用程序中的问题,但是我缺乏经验。试图找到更多信息,但无法找到。

应用程序实例化了一个非线程安全的用于数据检索的 COM 对象,因此添加了以下说明。

comObject=CreateObject("comServer.comObject")
returnValue=comObject.DoWork(.......)
...
comObject = Nothing

但是,当同时处理两个不同的http请求时,后者似乎覆盖了第一个请求,给第一个请求者一个错误。看起来 comObject 变量在请求之间是共享的。

如何实例化对象,使 IIS 中的每个单独请求都获得它自己的 comObject 实例?

【问题讨论】:

    标签: asp-classic com iis-7.5


    【解决方案1】:

    如果不知道对象做什么或如何做,就不可能给出具体的建议。必须做一个一般性描述:

    对象已损坏/有故障。处理问题是对象的责任。

    COM 对象应该在内部处理所有线程问题,或者如果它不能这样做或不想这样做(对于 STA 可以处理的那些方面),则应遵循 COM STA 单元。这深入到对象的设计中。

    无论选择何种 COM 单元,DoWork(...) 方法的语义都会阻止单独线程中的多个单独 COM 对象处理同时调用 - 充其量是一个严重有问题的设计。一个适当的设计要么包括显式处理冲突的机制,要么只是对调用代码隐藏冲突并在内部处理冲突。

    根据 DoWork() 所做的细节,可能有一些方法可以修复对象,使调用可以并行成功,或者相互阻塞以便有效地序列化调用,或者导致第二次调用调用抛出“你已经打电话给我”错误。同样,哪种方法更合适在很大程度上取决于该方法的作用。

    如果您无法修改这个损坏的组件,最好的选择是编写一个 COM 包装器,以确保序列化为真实对象。

    在任何情况下,您都无法从客户端(ASP VBScript)端做任何合理的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多