web-dev-qa-db-fra.com

ASP.NET MVC Url Route prenant en charge (point)

J'espère que vous pourrez m'aider avec le problème ci-dessous.

J'utilise ASP.NET MVC 3 sur IIS7 et j'aimerais que mon application prenne en charge les noms d'utilisateur comportant des points.

Exemple: http: //localhost/john.lee

Voici à quoi ressemble mon fichier Global.asax: ( http: // localhost/ / {nom d'utilisateur})

routes.MapRoute(
    "UserList",
    "{username}",
    new { controller = "Home", action = "ListAll" }
);

Les applications fonctionnent lorsque j'accède à d'autres pages telles que http: //localhost/john.lee/details etc.

Mais la page utilisateur principale ne fonctionne pas, j'aimerais que l'application fonctionne comme Facebook, où http://www.facebook.com/john.lee est pris en charge.

J'ai utilisé le code ci-dessous et cela n'a pas fonctionné du tout pour moi:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

J'ai été en mesure d'utiliser le code ci-dessous et de faire en sorte que l'application accepte les points, mais je ne voudrais certainement pas utiliser le code ci-dessous pour différentes raisons. Dites-moi qu'il existe un moyen de surmonter ce problème.

<modules runAllManagedModulesForAllRequests="false" />
35
Cindro

Je faisais face au même problème. La meilleure solution pour moi est donc:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
<system.webServer>
0
Satish Singh

Ajoutez un UrlRoutingHandler au web.config. Cela nécessite toutefois que votre URL soit un peu plus précise (par exemple, /Users/john.lee)..Cela oblige chaque URL commençant par/Utilisateurs à être traitée comme une URL MVC:

<system.webServer>    
  <handlers>      
    <add name="UrlRoutingHandler" 
         type="System.Web.Routing.UrlRoutingHandler, 
               System.Web, Version=4.0.0.0, 
               Culture=neutral, 
               PublicKeyToken=b03f5f7f11d50a3a" 
         path="/Users/*" 
         verb="GET"/>      
  </handlers>
</system.webServer>
57
Klaas Coenraads

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

Cela devrait fonctionner pour les deux IIS 6 & 7. Vous pouvez affecter des gestionnaires spécifiques à des chemins différents après le 'route' en modifiant path = "*" dans les éléments 'add'

  <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>
4
V.B.

Pour quiconque obtient une exception 'Impossible de créer une classe abstraite' lors de l'utilisation de l'approche UrlRoutingHandler, cela est probablement dû à:

  • Utiliser un 'chemin' restreint (par exemple path="/Files/*") dans votre déclaration web.config, et
  • Un dossier/chemin portant le même nom existe dans votre projet
1
Mark

Je ne pense pas que le point est le problème ici. Autant que je sache, le seul caractère qui ne devrait pas figurer dans le nom d'utilisateur est un /

Sans voir la route qui correspond à john.lee/details, il est difficile de dire ce qui ne va pas, mais je suppose que vous avez une autre route qui correspond à l'URL, ce qui empêche la correspondance exacte de la route avec les détails de l'utilisateur. 

Je recommande d'utiliser un outil tel que Glimpse pour déterminer quel itinéraire correspond.

0
Marnix van Valen