WebActivator.PreApplicationStartMethod не работает

[assembly:  WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.StructureMapMvc), "Start")]

namespace MyApp.App_Start
{
    public static class StructureMapMvc
    {
        public static void Start()
        {
            var container = IoC.Initialize();
            DependencyResolver.SetResolver(new SmDependencyResolver(container));
        }
    }
}

Вот мой код, который должен выполняться до Application_start в global.asax. Я обновлял свой веб-проект с mvc 3 до mvc 4. Итак, в этом процессе я допустил ошибку в пространстве имен. Это работало до того, как я исправил свое пространство имен. Сейчас это больше не работает. Я сбросил iis/очистил dns/перестроил решение/удалил временные файлы .net в C:\Windows\Microsoft.NET\Framework64\versionxxxxxx...\Temporary ASP.NET Files\root. Ничего не сработало. Я что-то упустил здесь? В методе Initialize() есть все мои вещи для разрешения зависимостей карты структуры. Итак, я не могу двигаться вперед, не выяснив это. Пытался диагностировать проблему так много часов, и мне нужна помощь.


person Maneeshpal    schedule 02.01.2013    source источник


Ответы (5)


Если ваш код находится в проекте веб-сайта (т. е. в папке App_Code), вы не можете использовать PreApplicationStartupMethod! Вместо этого вы можете использовать PostApplicationStartupMethod. Метод "Pre" выполняется до запуска global.asax *Application_Start*, а метод "Post" выполняется после.

Я потратил впустую час или два, прежде чем понял это, так что, надеюсь, это поможет кому-то еще избежать этого!

person kenchilada    schedule 13.03.2013

Мой опыт показывает, что WebActivator не будет работать, если настройки вашего проекта (в .csproj.user или .vbproj.user) имеют параметр <StartAction>NoStartPage</StartAction>, исправление состоит в том, чтобы установить его на <StartAction>CurrentPage</StartAction>, и тогда он должен работать при следующей отладке.

Кроме того, поскольку он находится в файле .user (который обычно не включается в svn), трудно определить, почему он работает в одних средах разработки, но не работает в других.

person Seph    schedule 19.05.2013

В WebActivator версии 1.5.3 файл MyClass.cs.pp не может просто находиться в папке App_Start, но должен находиться в папке content\App_Start, чтобы nuget install мог создать преобразованный файл в App_Start целевого проекта.

Это недокументировано, насколько я могу судить.

ПРИМЕЧАНИЕ. Похоже, что это решение работает, если исходный .nupkg был создан с использованием nuget pack с использованием обычного подхода к файловой системе, но НЕ при использовании nuget pack, нацеленного на конкретный файл .csproj.

person TimDog    schedule 04.01.2013

Для меня проблема возникла при создании частного репозитория NuGet с использованием загрузки NuGet.Server (он использует атрибут WebActivatorEx PreApplicationStartMethod).

Что я сделал, так это создал проект «Пустой веб-сайт». Это неверно: это должен быть проект пустого веб-приложения. Как только я создал пустое веб-приложение и переустановил NuGet.Server, все заработало нормально.

Итак: если вы использовали проект «Пустой веб-сайт», возможно, именно поэтому у вас возникла проблема. Вместо этого используйте пустой проект веб-приложения.

Я думаю, что в проекте «Пустой веб-сайт» отсутствует часть «клея» ASP.NET, который позволяет работать System.Web.PreApplicationStartMethod (используемому WebActivatorEx). Может быть, кто-то, кто знает немного больше деталей, мог бы объяснить, почему это так?

person Julian    schedule 12.11.2014

Моя проблема была двоякой.

1) не объявляя полный путь к типу

2) размещение атрибута внутри пространства имен, а не перед

Как только я исправил оба из них, это сработало.

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyApp.Api.Controllers.MyController), "AutoMapperStart")]


namespace MyApp.Api.Controllers
{

    public class MyController : ApiController
    {
        public static void AutoMapperStart()
        {
            MyMapperConfig.DefineMappings();
        }
    }
}
person Kildareflare    schedule 05.11.2015