Les points dans l’URL provoquent 404 avec ASP.NET mvc et IIS

J’ai un projet qui nécessite que mes URL aient des points dans le chemin. Par exemple, je peux avoir une URL telle que www.example.com/people/michael.phelps

Les URL avec le point génèrent un 404. Mon routage est correct. Si je passe michaelphelps, sans le point, alors tout fonctionne. Si j’ajoute le point, j’obtiens une erreur 404. L’exemple de site est exécuté sur Windows 7 avec IIS8 Express. URLScan n’est pas en cours d’exécution.

J’ai essayé d’append ce qui suit à mon fichier web.config:

   

Malheureusement, cela n’a pas fait de différence. Je viens de recevoir une erreur 404.0 Not Found.

Ceci est un projet MVC4 mais je ne pense pas que ce soit pertinent. Mon routage fonctionne bien et les parameters attendus sont présents, jusqu’à ce qu’ils incluent un point.

De quoi ai-je besoin pour configurer des points dans mon URL?

J’ai fonctionné en éditant les gestionnaires HTTP de mon site. Pour mes besoins, cela fonctionne bien et résout mon problème.

J’ai simplement ajouté un nouveau gestionnaire HTTP qui recherche des critères de chemin spécifiques. Si la demande correspond, elle est correctement envoyée à .NET pour traitement. Je suis beaucoup plus heureux avec cette solution que le URLRewrite pirate ou active RAMMFAR.

Par exemple, pour que .NET traite l’URL http://www.example.com/people/michael.phelps, ajoutez la ligne suivante à web.config de votre site dans l’élément system.webServer / handlers :

  

modifier

D’autres messages suggèrent que la solution à ce problème est RAMMFAR ou RunAllManagedModulesForAllRequests . L’activation de cette option activera tous les modules gérés pour toutes les demandes. Cela signifie que les fichiers statiques tels que les images, les fichiers PDF et tout le rest seront traités par .NET lorsqu’ils ne le seront pas. Cette option est préférable à moins que vous ayez un cas spécifique.

Après quelques recherches, je me suis rendu compte que relaxedUrlToFileSystemMapping ne fonctionnait pas du tout pour moi, ce qui fonctionnait dans mon cas était de définir RAMMFAR sur true, le même pour (.net 4.0 + mvc3) et (.net 4.5 + mvc4).

   

Soyez conscient lorsque vous définissez la véritable publication Hanselman de RAMMFAR sur RAMMFAR et ses performances

Je crois que vous devez définir la propriété relaxedUrlToFileSystemMapping dans votre web.config. Haack a écrit un article à ce sujet il y a quelque temps (et il y a d’autres publications de SO demandant les mêmes types de questions)

   

Ajoutez simplement cette section à Web.config, et toutes les requêtes à la route / {* pathInfo} seront traitées par le gestionnaire spécifié, même s’il y a des points dans pathInfo. (tiré de l’exemple ServiceStack MVC Host Web.config et de cette réponse https://stackoverflow.com/a/12151501/801189 )

Cela devrait fonctionner à la fois pour IIS 6 et 7. Vous pouvez assigner des gestionnaires spécifiques à différents chemins après la “route” en modifiant chemin = “*” dans les éléments “add”

                 

J’ai été bloqué sur cette question pendant longtemps en suivant tous les différents remèdes sans succès.

J’ai remarqué que lors de l’ajout d’une barre oblique [/] à la fin de l’URL contenant les points [.], Cela ne provoquait pas d’erreur 404 et cela fonctionnait réellement.

J’ai finalement résolu le problème en utilisant un réécrivant d’URL comme IIS URL Rewrite pour surveiller un motif particulier et append la barre oblique d’entraînement.

Mon URL ressemble à ceci: /Contact/~firstname.lastname donc mon modèle est simplement: /Contact/~(.*[^/])$

J’ai eu cette idée de Scott Forsyth, voir le lien ci-dessous: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

Solution de contournement MVC 5.0.

Beaucoup de réponses suggérées ne semblent pas fonctionner dans MVC 5.0.

Comme le problème des 404 points dans la dernière section peut être résolu en fermant cette section avec une barre oblique, voici le petit truc que j’utilise, propre et simple.

Tout en gardant un espace réservé à votre vue:

 @Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null) 

ajoutez un petit jquery / javascript pour faire le travail:

  

s’il vous plaît noter la barre oblique, qui est responsable de changer

 http://localhost:51003/GeoData/Manage/[email protected] 

dans

 http://localhost:51003/GeoData/Manage/[email protected]/ 

Réponse très facile pour ceux qui ont seulement cela sur une seule page Web. Modifiez votre lien d’action et un + “/” à la fin.

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) | 

Vous pouvez penser à utiliser des tirets plutôt que des points.

Dans Pro ASP MVC 3 Framework, ils suggèrent ceci pour créer des URL conviviales:

Évitez les symboles, les codes et les séquences de caractères. Si vous voulez un séparateur de mots, utilisez un tiret (/ my-great-article). Les caractères de soulignement sont peu amicaux et les espaces encodés en URL sont bizarres (/ my + great + article) ou dégoûtants (/ my% 20great% 20article).

Il mentionne également que les URL doivent être faciles à lire et à modifier pour les humains. Peut-être qu’une raison de penser à utiliser un tiret au lieu d’un point vient aussi du même livre:

N’utilisez pas les extensions de nom de fichier pour les pages HTML (.aspx ou .mvc), mais utilisez-les pour les types de fichiers spécialisés (.jpg, .pdf, .zip, etc.). Les navigateurs Web ne se soucient pas des extensions de nom de fichier si vous définissez le type MIME de manière appropriée, mais les utilisateurs attendent toujours que les fichiers PDF se terminent par .pdf

Ainsi, même si une période est encore lisible pour les humains (bien que moins lisible que les tirets, IMO), elle peut néanmoins être un peu confuse / trompeuse selon ce qui vient après la période. Et si quelqu’un a un nom de famille de zip? Ensuite, l’URL sera /John.zip au lieu de / John-zip, ce qui peut être trompeur, même pour le développeur qui a écrit l’application.

Serait-il possible de changer la structure de votre URL?
Pour ce que je travaillais, j’ai essayé un itinéraire pour

 url: "Download/{fileName}" 

mais il a échoué avec tout ce qui avait un. dedans.

J’ai changé de route pour

  routes.MapRoute( name: "Download", url: "{fileName}/Download", defaults: new { controller = "Home", action = "Download", } ); 

Maintenant je peux mettre localhost:xxxxx/File1.doc/Download et ça marche bien.

Mes assistants dans la vue l’ont également remarqué

  @Html.ActionLink("click here", "Download", new { fileName = "File1.doc"}) 

Cela crée également un lien vers le format localhost:xxxxx/File1.doc/Download .

Peut-être que vous pourriez mettre un mot inutile comme “/ view” ou une action à la fin de votre itinéraire pour que votre propriété puisse se terminer par un /mike.smith/view

J’ai essayé toutes les solutions ci-dessus mais aucune d’entre elles n’a fonctionné pour moi. Qu’est-ce qui a fonctionné était la désinstallation des versions de .NET> 4.5, y compris toutes ses versions multilingues; Finalement, j’ai ajouté des versions plus récentes (en anglais seulement) pièce par pièce. Voici les versions actuellement installées sur mon système:

  • 2.0
  • 3.0
  • 3,5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

Et son fonctionne toujours à ce stade. J’ai peur d’installer 4.6.2 car cela pourrait tout gâcher.

Donc, je ne pouvais que spéculer que 4.6.2 ou toutes ces versions non anglaises gâchaient ma configuration.

HTH quelqu’un.

J’ai été en mesure de résoudre ma version particulière de ce problème (j’ai dû faire en sorte que /customer.html achemine vers / customer, les barres obliques ne sont pas autorisées) en utilisant la solution sur https://stackoverflow.com/a/13082446/1454265 et en remplaçant le chemin par = “*. html”.

Comme solution, on pourrait aussi envisager un encodage dans un format ne contenant pas de symbole . , comme base64.

In js devrait être ajouté

 btoa(parameter); 

Dans le contrôleur

 byte[] bytes = Convert.FromBase64Ssortingng(parameter); ssortingng parameter= Encoding.UTF8.GetSsortingng(bytes); 

Ajoutez la règle de réécriture d’URL à l’archive Web.config. Vous devez avoir le module de réécriture d’URL déjà installé dans IIS. Utilisez la règle de réécriture suivante pour vous en inspirer.

                  

De plus, (lié) vérifiez l’ordre de vos mappages de gestionnaires. Nous avions un fichier .ashx avec un fichier .svc (par exemple /foo.asmx/bar.svc/path) dans le chemin suivant. Le mappage .svc était d’abord le 404 pour le chemin d’access .svc qui correspondait avant le .asmx. Je n’ai pas trop réfléchi, mais peut-être qu’url encodera le chemin.

Selon l’importance de conserver votre URI sans chaîne de requête, vous pouvez également transmettre la valeur avec des points dans la chaîne de requête, et non l’URI.

Par exemple, http://www.example.com/people?name=michael.phelps fonctionnera sans avoir à modifier les parameters ou quoi que ce soit.

Vous perdez l’élégance d’avoir un URI propre, mais cette solution ne nécessite pas de modifier ou d’append des parameters ou des gestionnaires.

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication1.Controllers { [RoutePrefix("File")] [Route("{action=index}")] public class FileController : Controller { // GET: File public ActionResult Index() { return View(); } [AllowAnonymous] [Route("Image/{extension?}/{filename}")] public ActionResult Image(ssortingng extension, ssortingng filename) { var dir = Server.MapPath("/app_data/images"); var path = Path.Combine(dir, filename+"."+ (extension!=null? extension:"jpg")); // var extension = filename.Subssortingng(0,filename.LastIndexOf(".")); return base.File(path, "image/jpeg"); } } }