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" />
Je faisais face au même problème. La meilleure solution pour moi est donc:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"></modules>
<system.webServer>
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>
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>
Pour quiconque obtient une exception 'Impossible de créer une classe abstraite' lors de l'utilisation de l'approche UrlRoutingHandler
, cela est probablement dû à:
path="/Files/*"
) dans votre déclaration web.config, etJe 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.