在STA中的IIS 7.5上运行经典ASP

在STA中的IIS 7.5上运行经典ASP,iis,asp-classic,com,iis-7.5,visual-foxpro,Iis,Asp Classic,Com,Iis 7.5,Visual Foxpro,试图通过启用AspCompat,使IIS 7.5上的经典ASP webapp在STA模式下运行。这是一个硬要求,因为正在实例化的COM对象不是线程安全的 <%@ Page Language="VBScript" AspCompat="true" Debug="false" %> 然而,这阻止了大多数COMException,仍然存在导致COMException的特定计时 如果对同一IIS服务器的多个请求来自不同的客户端,我可以做什么来强制保持STA行为不变 尝试遵循本文,并实现了页

试图通过启用AspCompat,使IIS 7.5上的经典ASP webapp在STA模式下运行。这是一个硬要求,因为正在实例化的COM对象不是线程安全的

<%@ Page Language="VBScript" AspCompat="true" Debug="false" %>
然而,这阻止了大多数COMException,仍然存在导致COMException的特定计时

如果对同一IIS服务器的多个请求来自不同的客户端,我可以做什么来强制保持STA行为不变

尝试遵循本文,并实现了页面加载,以防止在STA模式之前创建对象

看起来AspCompat还是被忽略了

[COMException (0x800706be): Creating an instance of the COM component with CLSID {B28A581A-6CE3-46E9-871F-B2E129F7D238} from the IClassFactory failed due to the following error: 800706be.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
   System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
   System.Activator.CreateInstance(Type type) +6
   System.Web.HttpServerUtility.CreateObject(String progID) +122
   ASP.myapp.Page_Load() +1670
   System.Web.Util.CalliHelper.ArglessFunctionCaller(IntPtr fp, Object o) +8
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +8760147
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +50
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627
更新: 请阅读这里和这里,STA对象实例化的位置很重要。在构造期间实例化对象将导致此问题。


尝试在页面加载中实例化,如示例所示。但是,这不会改变从另一个客户端访问页面时的行为。

好的,我们已经做到了,这就是我找到解决方案的方式。。在我们的例子中,我认为它链接到父路径,但也可能是会话状态

浏览至C:\Documents and Settings\$your user name$\My Documents\IIS 7.5\config

打开applicationHost.config

找到该部分

将该部分更改为以下内容…默认情况下,它只有缓存和空限制位,但可以随意调整您不需要的任何参数

<asp 
     enableParentPaths="true" 
     bufferingOn="true" 
     errorsToNTLog="true" 
     appAllowDebugging="true" 
     appAllowClientDebug="true" 
     scriptErrorSentToBrowser="true">

   <session allowSessionState="true" />
   <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
   <limits />
</asp>


保存并重新启动iis 7.5。

如果它使用应用程序锁围绕着COMObject访问

Dim oComSvr as object
oComSvr=Server.CreateObject("com_svr.my_svr")
...
Application.Lock
returnValue=oComSvr.selectform(value1, value2, ...)
Application.Unlock
但是,如果您以示例格式编写类似的内容来获得想法

Application["Counter"] = (int) Application["Counter"] + 1;
然后,您需要按如下方式使用“锁定”和“解锁”:

 Application.Lock();
 Application["Counter"] = (int) Application["Counter"] + 1;
 Application.Unlock();

这是因为线程可能会在从应用程序对象读取然后写入之间中断,因此另一个线程可能会更改为“计数器”存储的值。

感谢您的快速回复。不幸的是,这并没有改变我们案例中的行为。如果同时发出多个请求,则仍在重用ComServer。还有什么我们可以尝试的吗?嗨,Ramon Bertrand,据我所知,通过遵循上述参数,我们可以在IIS 7.5上设置经典asp。您可以更改applicationHost.Config上的配置。我已应用这些设置,并在IIS重置后确认它们处于活动状态。页面呈现得和以前一样好。但是,来自不同客户端的多个同时请求的STA问题仍然存在。再次感谢。我不知道如何把这与我们的情况联系起来。我想我需要更多的信息。我已经更新了问题。请查找现在包含的对象实例化。我如何应用这个答案?