Los puntos en la URL causan 404 con ASP.NET mvc e IIS

Resuelto Mark asked hace 12 años • 18 respuestas

Tengo un proyecto que requiere que mis URL tengan puntos en la ruta. Por ejemplo, puedo tener una URL como www.example.com/people/michael.phelps

Las URL con el punto generan un 404. Mi enrutamiento está bien. Si paso michaelphelps, sin el punto, entonces todo funciona. Si agrego el punto, aparece un error 404. El sitio de muestra se ejecuta en Windows 7 con IIS8 Express. URLScan no se está ejecutando.

Intenté agregar lo siguiente a mi web.config:

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

Lamentablemente eso no hizo la diferencia. Acabo de recibir un error 404.0 No encontrado.

Este es un proyecto MVC4 pero no creo que sea relevante. Mi enrutamiento funciona bien y los parámetros que espero están ahí, hasta que incluyen un punto.

¿Qué necesito configurar para poder tener puntos en mi URL?

Mark avatar Jul 31 '12 03:07 Mark
Aceptado

Conseguí que esto funcionara editando los controladores HTTP de mi sitio. Para mis necesidades, esto funciona bien y resuelve mi problema.

Simplemente agregué un nuevo controlador HTTP que busca criterios de ruta específicos. Si la solicitud coincide, se envía correctamente a .NET para su procesamiento. Estoy mucho más contento con esta solución que el hack de URLRewrite o la habilitación de RAMMFAR.

Por ejemplo, para que .NET procese la URL www.example.com/people/michael.phelps agregue la siguiente línea al web.config de su sitio dentro del system.webServer / handlerselemento:

<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" />

Editar

Hay otras publicaciones que sugieren que la solución a este problema es RAMMFARo RunAllManagedModulesForAllRequests. Al habilitar esta opción se habilitarán todos los módulos administrados para todas las solicitudes. Eso significa que .NET procesará archivos estáticos como imágenes, PDF y todo lo demás cuando no sea necesario. Es mejor dejar de lado esta opción a menos que tenga un caso específico para ello.

Mark avatar Aug 28 '2012 01:08 Mark

Después de hurgar un poco, descubrí que RelaxedUrlToFileSystemMapping no funcionó en absoluto para mí, lo que funcionó en mi caso fue configurar RAMMFAR en verdadero, lo mismo es válido para (.net 4.0 + mvc3) y (.net 4.5 + mvc4).

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

Tenga en cuenta al configurar RAMMFAR la verdadera publicación de Hanselman sobre RAMMFAR y el rendimiento

Tadeu Maia avatar Aug 21 '2012 23:08 Tadeu Maia

Me quedé estancado en este tema durante mucho tiempo siguiendo todos los diferentes remedios sin éxito.

Noté que al agregar una barra diagonal [/] al final de la URL que contiene los puntos [.], no arrojó un error 404 y realmente funcionó.

Finalmente resolví el problema usando una reescritura de URL como IIS URL Rewrite para observar un patrón particular y agregar la barra diagonal de entrenamiento.

Mi URL se ve así: /Contacto/~nombre.apellido, por lo que mi patrón es simplemente: /Contacto/~(.*[^/])$

Obtuve esta idea de Scott Forsyth, consulte el enlace a continuación: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

Leon van Wyk avatar May 30 '2015 15:05 Leon van Wyk

Creo que debes configurar la propiedad relaxUrlToFileSystemMapping en tu web.config. Haack escribió un artículo sobre esto hace un tiempo (y hay algunas otras publicaciones de SO que hacen el mismo tipo de preguntas)

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

Editar Según los comentarios a continuación, las versiones posteriores de .NET/IIS pueden requerir que esto esté en el system.WebServerelemento.

<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
Tommy avatar Jul 30 '2012 21:07 Tommy

Simplemente agregue esta sección a Web.config y todas las solicitudes a la ruta/{*pathInfo} serán manejadas por el controlador especificado, incluso cuando haya puntos en pathInfo. (tomado del ejemplo de ServiceStack MVC Host Web.config y esta respuesta https://stackoverflow.com/a/12151501/801189 )

Esto debería funcionar tanto para IIS 6 como para 7. Puede asignar controladores específicos a diferentes rutas después de la 'ruta' modificando path="*" en 'agregar' elementos

  <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>
V.B. avatar May 17 '2013 11:05 V.B.