J'ai créé des règles de routage dans mon application ASP.NET et sur ma machine de développement sur IIS7, tout fonctionne bien. Lorsque je déploie la solution sur le serveur prod qui a également IIS7, j'obtiens l'erreur 404 (page introuvable) lors de l'accès à l'URL. Peut-être que quelqu'un pourrait indiquer où est le problème?
Erreur réelle
Erreur HTTP 404.0 - Introuvable La ressource que vous recherchez a été supprimée, son nom a changé ou est temporairement indisponible. Informations détaillées sur l'erreur Module IIS Web Core Notification MapRequestHandler Handler StaticFile Error Code 0x80070002 URL demandée http://xxx.xxx.xxx.xxx:80/pdf-button Chemin physique C:\www\pathtoproject\pdf-button Méthode d'ouverture de session anonyme Utilisateur d'ouverture de session anonyme
Mon code actuel
<add key="RoutePages" value="all,-forum/"/>
UrlRewrite.Init(ConfigurationManager.AppSettings["RoutePages"]);
public static class UrlRewrite
{
public static void Init(string routePages)
{
_routePages = routePages.ToLower().Split(new[] { ',' });
RegisterRoute(RouteTable.Routes);
}
static void RegisterRoute(RouteCollection routes)
{
routes.Ignore("{resource}.axd/{*pathInfo}");
routes.Ignore("favicon.ico");
foreach (string routePages in _routePages)
{
if (routePages == "all")
routes.MapPageRoute(routePages, "{filename}", "~/{filename}.aspx");
else
if (routePages.StartsWith("-"))
routes.Ignore(routePages.Replace("-", ""));
else
{
var routePagesNoExt = routePages.Replace(".aspx", "");
routes.MapPageRoute(routePagesNoExt, routePagesNoExt, string.Format("~/{0}.aspx", routePagesNoExt));
}
}
}
}
Je viens de découvrir que les lignes ci-dessous doivent être ajoutées à web.config
fichier, maintenant tout fonctionne bien aussi sur le serveur de production.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
La solution suggérée
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
fonctionne, mais peut dégrader les performances et peut même provoquer des erreurs, car maintenant tous les modules HTTP enregistrés s'exécutent sur chaque demande, pas seulement les demandes gérées (par exemple .aspx). Cela signifie que les modules fonctionneront sur chaque .jpg .gif .css .html .pdf etc.
Une solution plus judicieuse consiste à l'inclure dans votre web.config:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
Le mérite en revient à Colin Farr. Consultez son article sur ce sujet à http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html .
Ma solution, après avoir tout essayé:
Mauvais déploiement, un ancien PrecompiledApp.config traînait autour de mon emplacement de déploiement et faisait que tout ne fonctionnait pas.
Mes derniers paramètres qui ont fonctionné:
Rien ne change dans le web.config - cela signifie aucun gestionnaire spécial pour le routage. Voici mon instantané des sections de nombreuses autres références de messages. J'utilise FluorineFX, j'ai donc ajouté ce gestionnaire, mais je n'en ai pas eu besoin d'autres:
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="None"/>
<pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
<httpRuntime requestPathInvalidCharacters=""/>
<httpModules>
<add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
</httpModules>
</system.web>
<system.webServer>
<!-- Modules for IIS 7.0 Integrated mode -->
<modules>
<add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
</modules>
<!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
Global.ashx: (seule méthode de n'importe quelle note)
void Application_Start(object sender, EventArgs e) {
// Register routes...
System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
"{*message}",
//the default value for the message
new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
//any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
new TestRoute.Handlers.PassthroughRouteHandler()
);
System.Web.Routing.RouteTable.Routes.Add(echoRoute);
}
PassthroughRouteHandler.cs - ceci a réalisé une conversion automatique de http://andrew.arace.info/stackoverflow à http://andrew.arace.info/#stackoverflow qui serait puis être géré par le default.aspx:
public class PassthroughRouteHandler : IRouteHandler {
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
return null;
}
}
Le problème pour moi était un nouveau serveur que System.Web.Routing était de la version 3.5 tandis que web.config demandait la version 4.0.0.0. La résolution a été
% WINDIR%\Framework\v4.0.30319\aspnet_regiis -i
% WINDIR%\Framework64\v4.0.30319\aspnet_regiis -i
Avoir cela dans Global.asax.cs l'a résolu pour moi.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Décochez cette option dans l'Explorateur Windows.
"Masquer les extensions de type de fichier pour les types connus"