316 votes

Points dans l'URL provoque une 404 avec ASP.NET mvc et IIS

J'ai un projet qui nécessite de mes URLs ont des points dans le chemin d'accès. Par exemple j'ai peut-être une URL de la forme www.example.com/people/michael.phelps

Les url avec le point de générer une erreur 404. Mon routage est très bien. Si je passe dans michaelphelps, sans le point, puis tout fonctionne. Si j'ajoute le point j'ai une erreur 404. L'exemple de site est en cours d'exécution sur Windows 7 avec IIS8 Express. URLScan est pas en cours d'exécution.

J'ai essayé d'ajouter ce qui suit à mon web.config:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

Malheureusement, ça ne fera pas de différence. Je viens de recevoir un 404.0 ne Trouve Pas d'erreur.

C'est un MVC4 projet, mais je ne pense pas que ce soit pertinent. Mon routage fonctionne très bien et les paramètres j'attends sont là, jusqu'à ce qu'ils comprennent un point.

Que dois-je configurer pour que je puisse avoir des points dans mon URL?

387voto

Mark S. Points 3627

J'ai eu ce travail par l'édition de mon site HTTP gestionnaires. Pour mes besoins ce qui fonctionne bien et qui résout mon problème.

J'ai simplement ajouté un nouveau gestionnaire HTTP qui cherche un chemin spécifique critères. Si la demande correspond à ce qu'il soit correctement envoyé .NET pour le traitement. Je suis beaucoup plus heureux avec cette solution que le URLRewrite hack ou de l'activation RAMMFAR.

Par exemple pour avoir .NET le processus de l'URL www.example.com/people/michael.phelps ajoutez la ligne suivante à votre site web.config au sein de l' system.webServer / handlers élément:

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

Modifier

Il y a d'autres postes, ce qui suggère que la solution à ce problème est - RAMMFAR ou RunAllManagedModulesForAllRequests. L'activation de cette option permettra à tous les modules gérés pour toutes les demandes. Cela signifie que les fichiers statiques, tels que des images, des fichiers Pdf et tout le reste sera traité par .NET quand ils n'ont pas besoin de l'être. Cette option est préférable à gauche sauf si vous avez un cas spécifique.

50voto

Tadeu Maia Points 360

Après quelques farfouillé, j'ai trouvé que relaxedUrlToFileSystemMapping ne fonctionne pas du tout pour moi, ce qui a fonctionné dans mon cas a été mise en RAMMFAR à true, la même chose est valable pour (.net 4.0 + mvc3) et de (.net 4.5 + mvc4).

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

Être conscient lors de la configuration de RAMMFAR vrai , Hanselman post sur RAMMFAR et de la performance

29voto

Tommy Points 17332

Je crois que vous devez définir la propriété relaxedUrlToFileSystemMapping dans votre site web.config. Haack a écrit un article à ce sujet il y a peu (et il ya quelques autres AFIN de postes de poser les mêmes types de question)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />

21voto

V.B. Points 1211

Il suffit d'ajouter cette section Web.config, et toutes les demandes de la route/{*pathInfo} sera géré par le gestionnaire spécifié, même quand il y a des points dans le pathInfo. (prises de ServiceStack MVC Web Hôte.config exemple et cette réponse http://stackoverflow.com/a/12151501/801189)

Cela devrait fonctionner pour les deux IIS 6 et 7. Vous pourriez assigner des gestionnaires des chemins différents après la "route" en modifiant le chemin d'accès="*" dans "ajouter" éléments

  <location path="route">
    <system.web>
      <httpHandlers>
        <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
      </httpHandlers>
    </system.web>
    <!-- Required for IIS 7.0 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
    </system.webServer>
  </location>

2voto

sdm350 Points 281

Vous voudrez peut-être penser à l'aide de tirets à la place de périodes.

En Pro ASP MVC 3 Cadre , suggèrent-ils, ce sujet de faire des URLs:

Éviter des symboles, des codes, et des séquences de caractères. Si vous souhaitez un mot un séparateur à utiliser un tiret (/ma-grande-article). Des traits de soulignement sont hostiles, et URL-encodé espaces sont bizarres (/ma+grande+article) ou dégoûtant (/mes%20great%20article).

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

Ne pas utiliser des extensions de nom de fichier pour les pages HTML (.aspx ou .mvc), mais ne les utiliser spécialisé de types de fichiers (.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 façon appropriée, mais les humains s'attendent toujours à des fichiers PDF à la fin .pdf

Ainsi, alors que la période est toujours lisible pour les humains (bien que moins lisible que les tirets, de l'OMI), il pourrait encore être un peu confus/trompeuse selon ce qui vient après la période. Que faire si quelqu'un a un nom de famille de zip? Ensuite, l'URL sera /John.zip au lieu de /Jean-zip, quelque chose qui peut être trompeuse, même pour le développeur qui a écrit l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X