J'ai travaillé sur un projet qui a des fonctionnalités communes, en particulier je voulais partager le fichier maître et les images associées/js/etc. À cette fin, la page maître et ses fichiers dépendants sont tous enveloppés dans une DLL "globale" qui est utilisée par tous les "sous-projets". Tout cela a bien fonctionné en développement, mais le déploiement a produit une surprise qui semble surprendre beaucoup de gens: VirtualPathProvider
ne fonctionne pas lorsque précompilé.VirtualPathProvider ne fonctionne pas (assez) en production sur IIS 7.5
Maintenant, grâce à this blog post containing a workaround, j'ai été en mesure de donner une autre tentative pour le faire fonctionner. Malheureusement, ça ne l'est toujours pas.
Je choisi de se débarrasser de ma Global.asax
mise en œuvre et est allé à l'approche de blog AppInitialize
:
public static class AppStart
{
public static void AppInitialize()
{
HostingEnvironment hostingEnvironmentInstance = (HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
MethodInfo mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);
mi.Invoke(hostingEnvironmentInstance, new object[] { new MasterPageProvider() });
}
}
Depuis le fournisseur réel fonctionne en debug, je ne vais pas l'inclure. Si vous souhaitez le voir, n'hésitez pas à demander. Je voulais juste garder la question aussi courte que possible.
L'aspect intéressant de toute cette situation est que la production ne génère pas d'erreurs sur le fait de ne pas pouvoir trouver la page maître. Pour moi, cela signifie que le fournisseur fonctionne, mais pour une raison quelconque, le reste des ressources (js/css/etc) ne sont pas extraites correctement de l'assembly.
Donc ma question se résume à ceci: quelles sont les raisons pour lesquelles cette solution fonctionnerait bien en développement, mais pas en production sur IIS 7.5?
MISE A JOUR 11/20/2011
Nous avons essayé la suggestion de David Ebbo et avait malheureusement pas de résultats. Ma config web ressemble à quelque chose comme ça maintenant:
<configuration>
<connectionStrings>
<clear />
<!-- ... -->
</connectionStrings>
<system.web>
<pages>
<controls>
<!-- ... -->
</controls>
</pages>
<compilation debug="true" targetFramework="4.0" />
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
MISE A JOUR 11/21/2011
Juste pour vérifier mes soupçons que le VirtualPathProvider travaillait en fait, je commentais la troisième ligne (mi.Invoke(....
) et redéployé le site. Comme je le soupçonnais, il se brise maintenant en raison de ne pas être en mesure de trouver le fichier MasterPage. Ce problème semble être lié uniquement aux fichiers statiques transmis via le VPP.
Je vais essayer quand je quitterai mon travail. Cela semble être la réponse à mes dernières découvertes (tout va bien au moins). Merci pour votre aide! –
Merci beaucoup pour votre aide. Cela me tourmente depuis quelques semaines maintenant! Je l'avais déjà rencontré auparavant, mais je n'avais pas considéré que IIS fournissait maintenant lui-même des fichiers statiques. Profitez du 225 rep! –
Si vous souhaitez étendre votre réponse, vous devez probablement mentionner que vous aurez besoin d'un gestionnaire par extension. De plus, je ne crois pas que vous ayez besoin du verbe POST (pas que cela provoque nécessairement quelque chose de mauvais, mais ...). –