В данный момент я работаю над сайтом (MVC), который довольно активно использует ajax для запроса данных от медленно реагирующих асинхронных ресурсов.
У меня проблема, хотя, каждый запрос должен быть сначала авторизован, и часть этой авторизации должна получить текущее имя пользователя RSA, выполнив Server.CreateObject ("Rsacookieapi.RSACookie"). GetUserName (). Проблема в том, что этот конкретный com-объект не запускается в MTApartments, а только в STAparatments (они не предлагают никакого альтернативного компонента .net, поэтому мы должны его использовать), поэтому CreateObject завершается ошибкой.
Я обошел это благодаря многим исследованиям, создав собственный обработчик маршрута, который выполняет контекст контроллера в STA (эквивалентно выполнению ASPCOMPAT = TRUE для веб-форм), но это приводит к дальнейшей проблеме, я больше не могу создавать асинхронный методы контроллера, когда контекст контроллера выполняется из STA.
Поэтому я начал думать, что если бы я мог создать COM-объект в STA и каким-то образом создать для него делегат / маршал, чтобы к нему можно было получить доступ из MTA, тогда все было бы хорошо.
В качестве подтверждения концепции у меня была глобальная переменная myComObject, которую я заполнил, выполнив CreateObject из запроса STA (/StaController/Index).
Затем я попытался получить доступ к myComObject из запроса MTA (/MtaController/Index).
Хорошая новость в том, что это работает. Похоже, что клиент обрабатывает все сортировки для меня.
Итак, я начал писать некоторый код, который порождает новый поток в STA, но проблема в том, что я все еще обязан передавать HttpContext.Current.Server (HttpServerUtilityBase) в поток, который при вызове .CreateObject в любом случае он просто выполняет его на MTA объекта .Server.
Надеюсь, это имеет смысл? Для уточнения:
- Я не хочу, чтобы какой-либо из моих контроллеров или действий выполнялся на STA
- Я хочу создать объект на STA, а затем предоставить доступ к нему из всех других MTA
Я искренне надеюсь, что у кого-то есть предложение!
Привет
Karl