Aspcompat на странице ASPX - PullRequest
       106

Aspcompat на странице ASPX

3 голосов
/ 06 марта 2011

На моих страницах aspx я вызываю COM-компонент, который использует STA.Поэтому я использую параметр aspcompat = true, но я хочу понять логику.Что именно это делает?Насколько я знаю, в STA предполагается, что вызывается только одним потоком.Поэтому я должен сам обеспечить безопасность потока.

Если это правильно, где параметр aspcompat обеспечивает безопасность потока?На всей странице или только там, где я получаю доступ к компоненту STA?

Ответы [ 3 ]

1 голос
/ 13 марта 2015

Это цитата взята из; Pro .NET Performance

AsP.nET по умолчанию выполняет страницы в потоках MTA.Если вы называете объекты sTA, они подвергаются маршалингу.Если вы преимущественно вызываете объекты sTA, это ухудшит производительность.Вы можете исправить это, пометив страницы атрибутом ASPCOMPAT следующим образом:

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

обратите внимание, что конструкторы страниц все еще выполняются в потоке MTA, поэтому отложите создание объектов sTA для событий Page_Load и Page_Init.

1 голос
/ 06 июня 2016

При использовании COM-компонентов однопотоковой квартиры (STA), таких как компоненты, разработанные с использованием Visual Basic, со страницы ASP.NET необходимо включить атрибут совместимости AspCompat = true вТег

<%@ Page>

на странице ASP.NET

Атрибут AspCompat заставляет страницу выполняться в режиме STA

ASP.NET по умолчаниюиспользует потоки MTA (многопоточные апартаменты)

При создании приложений ASP.NET, которые взаимодействуют с COM-объектами старой школы, такими как созданные с VB6 или Visual FoxPro (MTDLL), крайне важно, чтобы потоки, обслуживающие запросыиспользуйте однопотоковую резьбу в квартире.STA - это встроенная технология COM, которая позволяет надежно работать однопоточным компонентам в многопоточной среде.STA гарантирует, что COM-объекты, созданные в конкретном потоке, остаются в этом конкретном потоке, и любой доступ к COM-объекту из другого потока автоматически маршалирует этот поток в STA-потоке.Конечным эффектом является то, что вы можете иметь несколько потоков, но экземпляр COM-объекта живет в фиксированном, никогда не меняющемся потоке.

В ASP.NET по умолчанию используются потоки MTA (многопоточные апартаменты), которые являются действительно бесплатными, не обращающими внимания на маршалинг COM-объектов.Это значительно более эффективно, чем многопоточность STA, которая требует дополнительных затрат при определении того, нормально ли выполнять код в заданном потоке, или требуется ли какой-то вид потока / COM-маршалинга.Компоненты MTA COM могут быть очень эффективными, но компоненты STA COM в многопоточной среде всегда имеют значительную нагрузку.

STA в ASP.NET

Поддержка многопоточности STA в среде ASP.NET довольно ограничена.В частности, только оригинальная технология ASP.NET WebForms поддерживает многопоточность STA напрямую через его реализацию обработчика страниц STA или то, что вы можете знать как режим ASPCOMPAT.Для WebForms запустить компоненты STA так же просто, как указать атрибут ASPCOMPAT в теге @Page:

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

, который запускает страницу в режиме STA.Удаление выполняется в режиме MTA.Простой.

STA для не поддерживающих ASP.NET Technologies

Только WebForms поддерживает STA изначально

  • ASP.NET HttpHandlers
  • Веб-службы ASMX
  • ASP.NET MVC
  • Веб-службы WCF
  • Веб-API ASP.NET

Компоненты STA - это боль в заднице.Я чувствую вашу боль: -)

Хорошая ссылка:

https://weblog.west -wind.com / posts / 2012 / Sep / 18 / Создание-STA-COM-совместимый-ASPNET-applications # STAfornonsupportingASP.NETTechnologies

1 голос
/ 06 марта 2011

Эта директива заставляет ASP.NET предоставлять доступ к ASP-внутренним объектам и изменяет пул потоков на MTA.

Для более подробной информации извлекайте this

...