Asp classic 在经典ASP中访问线程不安全的COM对象

Asp classic 在经典ASP中访问线程不安全的COM对象,asp-classic,com,iis-7.5,Asp Classic,Com,Iis 7.5,试图解决一个经典ASP应用程序中的问题,但我缺乏经验。试图查找更多信息,但无法找到 应用程序实例化了一个COM对象以进行非线程安全的数据检索,因此添加了以下说明 comObject=CreateObject("comServer.comObject") returnValue=comObject.DoWork(.......) ... comObject = Nothing 但是,当同时处理两个不同的http请求时,后一个请求似乎覆盖了第一个请求,给第一个请求者一个错误。看起来好像请求之间共享

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

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

comObject=CreateObject("comServer.comObject")
returnValue=comObject.DoWork(.......)
...
comObject = Nothing
但是,当同时处理两个不同的http请求时,后一个请求似乎覆盖了第一个请求,给第一个请求者一个错误。看起来好像请求之间共享了comObject变量


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

如果不知道对象做什么或如何做,就不可能给出具体的建议。一般说明必须包括:

这个物体坏了。处理这个问题是目标的责任

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

不管COM单元的选择如何,DoWork(…)方法的语义阻止多个单独线程中的多个单独COM对象处理同时调用,充其量是一个严重问题的设计。正确的设计要么包括显式处理冲突的机制,要么只是对调用代码隐藏冲突并在内部处理冲突

根据DoWork()所做工作的详细信息,可能有一些方法可以修复对象,使调用能够并行成功,或者相互阻止以使调用有效序列化,或者导致第二个调用抛出“You ready called me”错误。同样,哪种方法更合适在很大程度上取决于该方法的功能

如果您不能修改这个损坏的组件,那么最好的选择是编写一个COM包装器,以确保序列化到真实对象

在任何情况下,您都无法从客户端(ASP VBScript)执行任何合理的操作