Briser ma tête pour obtenir le routage des URL dans l'environnement d'hébergement IIS 7: ASP.NET

StackOverflow https://stackoverflow.com/questions/1607930

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'implémenter le routage d'URL ASP.NET à l'aide de System.Web.Routing . Et cela semble bien fonctionner sur mon hôte local, cependant, lorsque je vais en ligne, je reçois une erreur 404 d'IIS 7 (fichier non trouvé). Pour votre information, l'hébergement utilise Windows Server 2008 IIS7.

Je pense que cela fait une différence dans la gestion du mécanisme de routage. Mais je ne suis pas capable de comprendre ce qui se passe exactement. Vous trouverez ci-dessous les paramètres et les modifications que j’ai apportées jusqu’à présent pour que cela fonctionne et pour que je sache que cela fonctionne parfaitement localement.

Paramètres Web.Config    
          

Et puis j'ai une section system.webserver qui a le balisage suivant

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="UrlRoutingModule"
               type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />

    </modules>
    <handlers>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>   

</system.webServer>

Ensuite, dans la section Application_Start, j'ai défini une route comme suit:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes); 
}
void RegisterRoutes(RouteCollection routes)
{               
    routes.Add(
       "MyRoute",
          new Route("ProductDetail/{ProductId}/{ProductName}",
                new MyRouteHandler("~/ProductDetail.aspx")));
}

Enfin, MyRouteHandler se présente comme suit:

 public IHttpHandler GetHttpHandler(RequestContext requestContext)
 {
     var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
                     _virtualPath, typeof(Page));
     HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
     return display;
 }

Et sur la page acheminée, je récupère l'ID de produit comme suit

ProductId = (int)HttpContext.Current.Items["Product"];

Et c'est la fin de mon bordel. Et cela fonctionne bien localement. Je tente cela depuis un moment, mais je n’ai pas réussi jusqu’à présent.

TOUTE AIDE SERA PROFONDEMENT APPRÉCIÉE.

Merci ...

Était-ce utile?

La solution

Je ne sais pas si vous avez pu comprendre le problème ... Cependant, si vous cherchez toujours une solution, essayez la solution suivante. Il y a quelque temps, j'ai dû faire face à la même situation et le faire fonctionner à l'aide de règles de réécriture dans la configuration Web pour lesquelles vous n'avez besoin d'aucun mécanisme de routage. Donc, tout d’abord, je vous encourage à supprimer tous les paramètres de routage et le code du fichier Global.asax.

Ensuite, dans la section, vous pouvez ajouter les règles de réécriture suivantes:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="map1" defaultValue="(.+)"/>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for map1">
        <match url="product/(.+)/(.+)"/>
        <conditions>
            <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/>
        </conditions>
        <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/>
        </rule>
    </rules>
  </rewrite>

Si vous rencontrez des problèmes pour comprendre le mécanisme de réécriture, je vous recommande de lire cet article de Scott Guthrie.

Je pense que cela devrait fonctionner pour vous dans un environnement IIS 7.0 ou 7.5.

Autres conseils

J'ai suivi cet article: Comment: utiliser le routage avec des formulaires Web

Avant, je trouvais que j'avais des problèmes sur mon hôte partagé et aucun problème localement. C'était mon web.config.

Mon hôte utilisait IIS 7 avec pipeline intégré, il me manquait ceci:

<handlers>
    <!---after all the others--->       
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*"
             path="UrlRouting.axd"
             type="System.Web.HttpForbiddenHandler,
             System.Web, Version=2.0.0.0,
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>

EDIT: en fonction de vos paramètres et de votre code, il ne reste plus qu'à vérifier si la dll Routing est définie dans web.config et également déployée dans votre répertoire bin:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
  Culture=neutral, 
  PublicKeyToken=31BF3856AD364E35"/>

Essayez ceci dans votre web.config. Travaillé pour moi.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Juste pour vous informer de ce qui a finalement été ma solution ... sur IIS7, changez le mode de pipeline en mode intégré et je suivis l'ajout de lignes sur le lien web.config à partir du lien ci-dessus ... http://msdn.microsoft.com/en-us/library/cc668202. aspx

bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top