ASP.NET MVC Поддержка URL-маршрутов (точка) - PullRequest
35 голосов
/ 14 февраля 2012

Я надеюсь, что вы можете помочь мне с приведенной ниже проблемой.

Я использую ASP.NET MVC 3 на IIS7 и хочу, чтобы мое приложение поддерживало имена пользователей с точками.

Пример:http://localhost/john.lee

Вот так выглядит мой Global.asax: (http://localhost/{username})

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

Приложения работают, когда я обращаюсь к другим страницам, таким как http://localhost/john.lee/details и т. Д.

Но главная страница пользователя не работает, я хотел бы, чтобы приложение работало как Facebook, где поддерживается http://www.facebook.com/john.lee.

Я использовал приведенный ниже код, но он не работалработать на меня вообще:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

Я смог использовать приведенный ниже код и заставить приложение принимать точки, но я определенно не хотел бы использовать приведенный ниже код по многим другим причинам, пожалуйста, скажите мне, что естьспособ преодолеть эту проблему.

<modules runAllManagedModulesForAllRequests="false" />

Ответы [ 5 ]

58 голосов
/ 26 октября 2012

Добавьте UrlRoutingHandler в web.config.Это требует, чтобы ваш URL был немного более конкретным (например, /Users/john.lee).Это заставляет каждый URL, начинающийся с / Users, обрабатываться как 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>
4 голосов
/ 17 мая 2013

Просто добавьте этот раздел в Web.config, и все запросы к маршруту / {* pathInfo} будут обрабатываться указанным обработчиком, даже если в pathInfo есть точки.(взято из примера ServiceStack MVC Host Web.config и этого ответа https://stackoverflow.com/a/12151501/801189)

Это должно работать как для IIS 6, так и для 7. Вы можете назначить определенные обработчики для разных путей после «маршрута», изменив path = "* "in 'add' elements

  <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>
1 голос
/ 13 июля 2018

Для тех, кто получает исключение «Невозможно создать абстрактный класс» при использовании подхода UrlRoutingHandler, это, вероятно, связано с:

  • Использование ограниченного пути (например, path="/Files/*") в объявлении web.config и
  • В вашем проекте существует папка / путь с тем же именем
1 голос
/ 14 апреля 2018

Я столкнулся с той же проблемой.Поэтому лучшее решение для меня:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
<system.webServer>
0 голосов
/ 14 февраля 2012

Я не думаю, что точка - это проблема здесь. AFAIK единственный символ, который не должен быть в имени пользователя, это /

Не видя маршрут, который соответствует john.lee/details, трудно сказать, что не так, но я предполагаю, что у вас есть другой маршрут, который соответствует URL, препятствуя правильному сопоставлению маршрута с данными пользователя.

Я рекомендую использовать инструмент, такой как Glimpse , чтобы выяснить, какой маршрут соответствует.

...