2011-11-17 3 views
2

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.

Répondre

3

Vous devez définir une ligne pour chaque fichier statique que vous souhaitez ignorer dans votre fichier web.config afin de les acheminer via votre VPP. Voir ci-dessous pour des exemples.

<system.webServer> 
    <handlers> 
     <add name="Images" path="*.png" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" /> 
     <add name="Stylesheets" path="*.css" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" /> 
    </handlers> 
</system.webServer> 
+0

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! –

+0

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! –

+0

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 ...). –

2

Peut-être que le problème est que les demandes de fichiers statiques ne passent pas par ASP.NET par défaut dans IIS. Essayez d'activer runAllManagedModulesForAllRequests dans web.config. par exemple.

<modules runAllManagedModulesForAllRequests="true" /> 
+0

Malheureusement, pas de dés sur celui-ci.J'ai donné un coup de feu et ai mis à jour ma question avec des détails sur la tentative. Merci pour la recommandation cependant. –

2

Jetez un oeil à ce post. Il explique comment obtenir des fichiers statiques à travers un fournisseur de chemin d'accès virtuel dans IIS 7. Je crois que cela va résoudre votre problème. IIS 7.5 gérera les fichiers statiques lui-même.

+0

Le lien semble être rompu ... –

+0

@Ryan, thx. Le lien a été corrigé. J'espère que cela aide! – santiagoIT

Questions connexes