Подтвердить что ты не робот

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. Итак, в этом процессе я допустил ошибку в пространстве имен. Это работало до того, как я исправил свое пространство имен. Теперь он больше не работает. я reset iis/flushed dns/rebuilt solution/удалены временные .net файлы в C:\Windows\Microsoft.NET\Framework64\versionxxxxxx...\Временные файлы ASP.NET\root. Ничего не получилось. Я что-то пропустил? В методе Initialize() есть все элементы для создания зависимостей в моей структуре. Поэтому я не могу двигаться вперед, не соображая этого. Пытался диагностировать проблему в течение стольких часов, и мне нужна помощь.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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();
        }
    }
}