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() есть все элементы для создания зависимостей в моей структуре. Поэтому я не могу двигаться вперед, не соображая этого. Пытался диагностировать проблему в течение стольких часов, и мне нужна помощь.
Ответы
Ответ 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();
}
}
}