WebActivator.PreApplicationStartMethod ne fonctionne pas

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

Voici mon code qui est censé s’exécuter avant Application_start dans global.asax. Je mettais à niveau mon projet Web de MVC 3 à MVV 4. Ainsi, dans ce processus, j’ai commis une erreur dans un espace de noms. Cela fonctionnait avant que je corrige mon espace de noms. Cela ne fonctionne plus maintenant. Je réinitialise iis / flushed dns / rebuilt solution / supprime les fichiers .net temporaires dans C: \ Windows \ Microsoft.NET \ Framework64 \ versionxxxxxx … \ Temporary ASP.NET Files \ root. Rien n’a fonctionné. Est-ce que j’ai râté quelque chose? La méthode Initialize () contient tous les éléments de résolution de dépendances de ma structure. Donc, je ne peux pas avancer sans comprendre cela. J’ai essayé de diagnostiquer le problème pendant tant d’heures et j’ai besoin d’aide.

Si votre code est dans un projet de site Web (c’est-à-dire sous le dossier App_Code), vous ne pouvez pas utiliser PreApplicationStartupMethod ! Vous pouvez utiliser PostApplicationStartupMethod à la place. La méthode “Pre” est exécutée avant que global.asax * Application_Start * ne soit exécutée, tandis que “Post” est exécutée après.

J’ai perdu une bonne heure ou deux avant de comprendre, alors j’espère que cela aidera quelqu’un d’autre à éviter cela!

Avec WebActivator version 1.5.3, le fichier MyClass.cs.pp ne peut pas uniquement résider dans le dossier App_Start , mais doit content\App_Start dans le dossier content\App_Start afin de nuget install à nuget install le fichier transformé dans le App_Start du projet cible.

Ceci est non documenté, autant que je peux dire.

REMARQUE: cette solution semble fonctionner tant que le .nupkg origine .nupkg été créé à l’aide d’ nuget pack utilisant une approche de système de fichiers classique, mais PAS si vous utilisez nuget pack ciblant un fichier .csproj spécifique.

D’après mon expérience, WebActivator ne fonctionnera pas si les parameters de votre projet (dans .csproj.user ou .vbproj.user ) ont pour paramètre NoStartPage le correctif consiste à le définir sur CurrentPage et cela devrait alors fonctionner la prochaine fois que vous déboguez.

De plus, étant donné qu’il se trouve dans un fichier .user (qui n’est généralement pas inclus dans svn), il est difficile de déterminer pourquoi cela fonctionne sur certains environnements de développement mais pas sur d’autres.

Pour moi, le problème que je rencontrais était lors de la création d’un référentiel NuGet privé à l’aide du téléchargement NuGet.Server (il utilise l’atsortingbut WebActivatorEx PreApplicationStartMethod).

Ce que j’ai fait était de créer un projet de site Web vide. Ceci est incorrect: il doit s’agir d’un projet d’ application Web vide. Une fois que j’ai créé l’application Web vide et réinstallé NuGet.Server, tout a bien fonctionné.

Donc: si vous avez utilisé un projet de site Web vide, c’est peut-être pour cela que vous rencontrez le problème. Utilisez plutôt un projet d’application Web vide.

Je pense que le projet de site Web vide ne contient pas l’un des éléments “collants” ASP.NET, qui permet à System.Web.PreApplicationStartMethod (utilisé par WebActivatorEx) de fonctionner. Peut-être que quelqu’un qui connaît un peu plus les détails pourrait expliquer pourquoi c’est?

Mon problème était double.

1) ne pas déclarer le chemin complet du type

2) placer l’atsortingbut dans l’espace de noms, pas avant

Une fois que j’ai corrigé les deux, cela a fonctionné.

 [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyApp.Api.Controllers.MyController), "AutoMapperStart")] namespace MyApp.Api.Controllers { public class MyController : ApiController { public static void AutoMapperStart() { MyMapperConfig.DefineMappings(); } } }