2013-10-03 2 views
2

j'ai simple IHttpModule:Comment enregistrer un HttpModule compatible avec VS2012 Cassini et IIS7?

using System; 
using System.Web; 

namespace DummyPlaceholder 
{ 
    class PerformanceHttpModule : IHttpModule 
    { 
     public void Init(HttpApplication application) 
     { 
     } 

     public void Dispose() 
     { 
     } 
    } 
} 

Et vous inscrire HttpModules intérieur web.config:

<configuration> 
    <system.web> 
     <httpModules> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </httpModules> 
    </system.web> 
</configuration> 

Quand je développais, et de tester localement dans mon Visual Studio 2012 intégré ("Cassini") serveur web, tout a bien fonctionné.

Quand il est venu le temps de déployer sur un live serveur web IIS7, le serveur give a 500 Internal Server Error, and absolutely no information about the cause anywhere.

Le problème est que IIS7 changé la façon dont vous vous inscrivez HttpModules, vous n'utilisez plus system.web, au contraire, vous devez maintenant utiliser system.webServer:

<configuration> 
    <system.webServer> 
     <modules> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </modules> 
    </system.webServer> 
</configuration> 

Et maintenant qui fonctionne sur IIS, mais ne fonctionne pas à l'intérieur de Visual studio 2012.

ce que j'ai besoin est une solution Cela fonctionne dans les deux, sans avoir à modifier le fichier web.config lors de sa publication.

Le problème est que IIS7 et plus récente, ont une nouvelle "intégré" mode. Le mode alternatif est le comportement que IIS6 avait, appelé "Classic" mode.

Il est évident que je dois mettre le Visual Studio intégré serveur web en mode "intégré", afin qu'il regarde:

configuration/webServer/modules 

pour les modules.

Comment faire cela?

Bonus lecture

Répondre

1

est ici un gars du projet Cassini expliquant que "Integrated" modules will never be supported.

Et parmi les douzaine de questions de personnes souffrant de ce problème, il y avait une solution hack:

Vous émettez un remove pour enlever le system.web/httpModule, avant d'ajouter le system.webServer/module module.

<configuration> 
    <system.web> 
     <httpModules> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </httpModules> 
    </system.web> 

    <system.webServer> 
     <modules> 
     <remove name="PerformanceHttpModule" /> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </modules> 
    </system.webServer> 
</configuration> 
  • Cassini ne supporte que la première syntaxe, mais ne comprend pas ou accident sur la deuxième
  • IIS ne comprennent que la seconde syntaxe, et se bloque sur la première
  • Avec leurs pouvoirs combinés, vous obtenir un système aussi bien pensé que Tomcat et WebSphere.
1

Vous pouvez indiquer le mode pipeline intégré sur IIS7 pour ne pas valider la configuration (à savoir, élever pas une exception en cas de contenu dans l'élément <httpModules>). Mettez un <validation validateIntegratedModeConfiguration="false" /> dans votre élément <system.webServer>.

http://www.iis.net/configreference/system.webserver/validation

<configuration> 
    <system.web> 
     <httpModules> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </httpModules> 
    </system.web> 

    <system.webServer> 
     <modules> 
     <remove name="PerformanceHttpModule" /> 
     <add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/> 
     </modules> 
     <validation validateIntegratedModeConfiguration="false" /> 
    </system.webServer> 
</configuration> 
Questions connexes