Los puntos en la URL causan 404 con ASP.NET mvc e IIS
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?
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 / handlers
elemento:
<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 RAMMFAR
o 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.
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
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
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.WebServer
elemento.
<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
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>