ASPX中的Aspcompat

时间:2011-03-06 18:02:51

标签: .net com sta mta

在我的aspx页面中,我调用了一个使用STA的COM组件。所以我使用aspcompat = true参数,但我想了解逻辑。它到底是做什么的?据我所知,在STA中,假设仅由一个线程调用。所以我应该自己提供线程安全。

如果这是正确的,aspcompat参数在哪里提供线程安全?在整个页面上,还是我访问STA组件的位置?

3 个答案:

答案 0 :(得分:1)

该指令使ASP.NET提供对ASP内部对象的访问,并将线程池更改为MTA。

有关详细信息,请结帐this

答案 1 :(得分:1)

这是引自; Pro .NET Performance

  

默认情况下,AsP.nET在MTA线程上执行页面。如果你打电话给sTA   对象,他们进行编组。如果你主要打电话给sTA   对象,这会降低性能。你可以通过标记来解决这个问题   具有ASPCOMPAT属性的页面,如下所示:

<%@Page Language = "vb" AspCompat = "true" %>
     

请注意,页面构造函数仍然在MTA线程中执行,因此推迟   为Page_Load和Page_Init事件创建sTA对象。

答案 2 :(得分:1)

  

使用单线程单元(STA)COM组件时,如   使用Visual Basic开发的组件,来自ASP.NET页面   必须在

中包含兼容性属性 AspCompat = true
<%@ Page>
  ASP.NET页面上的

标签

     

AspCompat属性强制页面在STA模式下执行

     

ASP.NET默认使用MTA(多线程单元公寓)线程

     

构建与旧学校COM接口的ASP.NET应用程序时   用VB6或Visual FoxPro(MTDLL)创建的对象就是这样的   服务请求的线程使用非常重要   单线程公寓线程。 STA是COM内置技术   这使得基本上单线程组件可以可靠地运行   在多线程环境中。 STA保证COM对象   在特定线程上实例化保留在该特定线程和任何线程上   从另一个线程访问COM对象会自动封送它   线程到STA线程。最终效果是你可以有多个   线程,但COM对象实例生活在一个永不改变的固定上   线。

     

ASP.NET默认使用MTA(多线程单元)线程   是真正自由旋转的线程,不关注COM对象   封送处理。这比STA线程有效得多   在确定是否可以在a上运行代码时需要一些开销   给定线程或是否需要某种线程/ COM编组   发生。 MTA COM组件可以非常高效,但是STA COM   多线程环境中的组件总是趋于公平   开销量。

ASP.NET中的STA

  

ASP.NET框架中对STA线程的支持相当有限。   特别是只有原始的ASP.NET WebForms技术支持   STA直接通过其STA Page Handler实现进行线程处理   你可能知道ASPCOMPAT模式。对于运行STA组件的WebForms   就像在@Page标签中指定ASPCOMPAT属性一样简单:

<%@ Page Language="C#" AspCompat="true" %>
  

以STA模式运行页面。删除它在MTA模式下运行。简单。

用于非支持ASP.NET技术的STA

  

只有WebForms本身支持STA

  • ASP.NET HttpHandlers
  • ASMX网络服务
  • ASP.NET MVC
  • WCF Web服务
  • ASP.NET Web API
STA组件是一个痛苦的屁股。我感到你的痛苦: - )

好参考:

https://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications#STAfornonsupportingASP.NETTechnologies