tag parameter net mvc asp asp.net-mvc iis iis-7 iis-express iis-8

asp.net-mvc - parameter - html tags asp net core



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

¿Sería posible cambiar su estructura de URL?
Por lo que estaba trabajando probé una ruta para

url: "Download/{fileName}"

pero falló con todo lo que tenía un. en eso.

Cambié la ruta a

routes.MapRoute( name: "Download", url: "{fileName}/Download", defaults: new { controller = "Home", action = "Download", } );

Ahora puedo poner en localhost:xxxxx/File1.doc/Download y funciona bien.

Mis ayudantes en la vista también recogieron en él

@Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})

que hace un enlace al localhost:xxxxx/File1.doc/Download formato también.

Tal vez podría poner una palabra innecesaria como "/ ver" o acción en el final de su ruta para que su propiedad pueda terminar con un final / algo como /mike.smith/view

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 ruta está bien. Si paso en michaelphelps, sin el punto, entonces todo funciona. Si agrego el punto obtengo 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>

Desafortunadamente eso no hizo una 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?


Además, (relacionado) verifique el orden de sus asignaciones de controlador. Tuvimos un .ashx con un .svc (por ejemplo, /foo.asmx/bar.svc/path) en la ruta después de él. El mapeo .svc fue primero 404, por lo tanto, para la ruta .svc que coincidía antes del .asmx. No pensé demasiado, pero tal vez la url que codifica el camino se ocuparía de esto.


Agregue la regla de reescritura de URL al archivo web.config. Debe tener el módulo de reescritura de URL ya instalado en IIS. Use la siguiente regla de reescritura como inspiración para la suya.

<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Add trailing slash for some URLs" stopProcessing="true"> <match url="^(.*(/.).+[^//])$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Redirect" url="{R:1}/" /> </rule> </rules> </rewrite> </system.webServer> </configuration>


Como solución también se podría considerar la codificación a un formato que no contenga un símbolo . , como base64.

En js se debe agregar

btoa(parameter);

En el controlador

byte[] bytes = Convert.FromBase64String(parameter); string parameter= Encoding.UTF8.GetString(bytes);


Conseguí este trabajo 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 URLRewrite hackea o habilita 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 elemento system.webServer / handlers :

<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 . Habilitar esta opción habilitará todos los módulos administrados para todas las solicitudes. Eso significa que los archivos estáticos como imágenes, archivos PDF y todo lo demás serán procesados ​​por .NET cuando no sea necesario. Es mejor dejar estas opciones a menos que tenga un caso específico para ello.


Creo que tienes que establecer la propiedad relaxedUrlToFileSystemMapping en tu web.config. Haack escribió un artículo sobre esto hace un rato (y hay otras publicaciones de SO que hacen el mismo tipo de pregunta)

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


Dependiendo de lo importante que es para usted mantener su URI sin cadenas de consulta, también puede pasar el valor con puntos como parte de la cadena de consulta, no la URI.

Por ejemplo, www.example.com/people?name=michael.phelps funcionará, sin tener que cambiar ninguna configuración ni nada.

Pierde la elegancia de tener una URI limpia, pero esta solución no requiere cambiar o agregar configuraciones o controladores.


Después de hurgar un poco, encontré que relaxedUrlToFileSystemMapping no funcionó 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 verdadera publicación de Hanselman sobre RAMMFAR y el rendimiento


Es posible que desee pensar en utilizar guiones en lugar de puntos.

En Pro ASP MVC 3 Framework sugieren esto para hacer URLs amigables:

Evita los símbolos, códigos y secuencias de caracteres. Si desea un separador de palabras, use un guión (/ my-great-article). Los guiones bajos son hostiles, y los espacios codificados en URL son extraños (/ my + great + article) o repugnantes (/ my% 20great% 20article).

También menciona que las URL deben ser fáciles de leer y cambiar para los humanos. Tal vez una razón para pensar en usar un guión en lugar de un punto también proviene del mismo libro:

No use extensiones de nombre de archivo para páginas HTML (.aspx o .mvc), pero sí las use para tipos de archivo especializados (.jpg, .pdf, .zip, etc.). A los navegadores web no les importan las extensiones de nombre de archivo si configura el tipo MIME de manera adecuada, pero los humanos aún esperan que los archivos PDF terminen con .pdf

Entonces, si bien un período aún es legible para los humanos (aunque es menos legible que los guiones, IMO), aún puede ser un poco confuso / engañoso dependiendo de lo que ocurra después del período. ¿Qué pasa si alguien tiene un apellido de zip? Luego, la URL será /John.zip en lugar de / John-zip, algo que puede ser engañoso incluso para el desarrollador que escribió la aplicación.


MVC 5.0 Solución.

Muchas de las respuestas sugeridas no parecen funcionar en MVC 5.0.

Como el problema de los 404 puntos en la última sección se puede resolver cerrando esa sección con una barra diagonal, aquí está el pequeño truco que uso, limpio y simple.

Mientras mantiene un marcador de posición conveniente en su opinión:

@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)

agregue un poco de jquery / javascript para hacer el trabajo:

<script> $(''a:contains("Change your Town")'').on("click", function (event) { event.preventDefault(); window.location.href = ''@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })'' + "/"; });</script>

tenga en cuenta la barra inclinada, que es responsable de cambiar

http://localhost:51003/GeoData/Manage/[email protected]

dentro

http://localhost:51003/GeoData/Manage/[email protected]/


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

Noté que al agregar una barra inclinada [/] al final de la URL que contiene los puntos [.], No se generó un error 404 y realmente funcionó.

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

Mi URL se ve así: /Contact/~firstname.lastname así que mi patrón es simplemente: /Contact/~(.*[^/◆)

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


Probé todas las soluciones anteriores, pero ninguna de ellas funcionó para mí. Lo que funcionó fue que desinstalé versiones .NET> 4.5, incluidas todas sus versiones multilingües; Eventualmente agregué versiones más nuevas (solo en inglés) pieza por pieza. Ahora mismo las versiones instaladas en mi sistema son las siguientes:

  • 2.0
  • 3.0
  • 3.5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

Y todavía está funcionando en este punto. Tengo miedo de instalar 4.6.2 porque podría estropearlo todo.

Así que solo pude especular que 4.6.2 o todas esas versiones que no estaban en inglés estaban arruinando mi configuración.

HTH alguien.


Pude resolver mi versión particular de este problema (tuve que hacer la ruta /customer.html a / customer, no se permiten barras diagonales) usando la solución en https://.com/a/13082446/1454265 , y sustituyendo la ruta = "*. html".


Respuesta súper fácil para aquellos que solo tienen esto en una página web. Edita tu enlace de acción y un + "/" al final.

@Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |


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 Web.config de HostStock MVC Host y esta respuesta https://.com/a/12151501/801189 )

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

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


using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication1.Controllers { [RoutePrefix("File")] [Route("{action=index}")] public class FileController : Controller { // GET: File public ActionResult Index() { return View(); } [AllowAnonymous] [Route("Image/{extension?}/{filename}")] public ActionResult Image(string extension, string filename) { var dir = Server.MapPath("/app_data/images"); var path = Path.Combine(dir, filename+"."+ (extension!=null? extension:"jpg")); // var extension = filename.Substring(0,filename.LastIndexOf(".")); return base.File(path, "image/jpeg"); } } }