Route ASP.NET MVC: contourne le gestionnaire de fichiers static pour le chemin

Je bine et bricole depuis quelques heures et je n’ai vraiment pas fait beaucoup de progrès, alors espérons que quelqu’un ici pourra vous aider.

J’essaie de faire en sorte que toutes les demandes d’un certain chemin soient traitées par un composant tiers.

EDIT Et j’ai besoin de toutes les demandes à tous les autres chemins pour se comporter normalement.

J’utilise un gestionnaire d’itinéraire avec un mappage générique comme celui-ci:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

Tous les itinéraires traditionnels sont correctement acheminés vers le gestionnaire, ce qui permet de les transmettre facilement au composant tiers. Lorsque je frappe des fichiers statiques (.html, .txt, etc.), ils sont récupérés par le gestionnaire StaticFile au lieu de mon gestionnaire. J’essaie donc de désactiver le gestionnaire StaticFile comme suit (simplifié):

      

Cela désactive le gestionnaire StaticFile, mais MVC ne détecte toujours pas l’itinéraire.

Je préférerais ne pas avoir à créer mon propre gestionnaire et à injecter dans la stack de demandes ASP, car il semble qu’il devrait exister un moyen heureux pour MVC de le faire.

Des pensées? Et merci.

Il y a quelques options ici.

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

Si vous voulez vraiment que toutes les requêtes soient acheminées via le canal asp.net, il vous faut.

    

Mettre à jour

Une autre option, en particulier si votre besoin de contourner le gestionnaire statique est limité à un sous-ensemble de votre site, consiste à utiliser les éléments suivants:

   

Considérant que, sur les sites mvc, la plupart des fichiers statiques sont gérés à partir de plusieurs répertoires bien connus, il s’agit d’une meilleure option.

La meilleure solution consiste probablement à utiliser un enregistreur d’URL pour adresser les demandes de l’URL d’origine à une alternative conviviale pour MVC.

Par exemple, supposons que vous deviez pouvoir charger automatiquement les URL relatives dans le contenu servi à partir d’une firebase database.

 RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

Ces règles vous permettront de configurer deux routes MVC:

 routes.MapRoute( "Load Item", "load/{itemId}", new { controller = "Load", action = "Index" } ); routes.MapRoute( "Load Relative Item", "load/{itemId}/rel", //?path= new { controller = "Load", action = "Relative" } ); 

Et puis vos méthodes d’action sont simples:

  public ActionResult Index(int itemId) { ... } public FileStreamResult Relative(int itemId, ssortingng path) { ... } 

La première règle de réécriture est là pour empêcher les chemins contenant / rel d’être réécrits; ils sont déjà dans leur forme définitive. La deuxième règle de réécriture proxie (au lieu de redirect) la demande.

par exemple

 /load/1234/file.xml 

devient

 /load/1234/rel?path=file.xml 

L’utilisation de la requête par requête au lieu d’effectuer une redirection client permet également aux chemins relatifs nesteds de fonctionner (et cache la sauce secrète de l’utilisateur final).