“El recurso no se puede encontrar.” Error cuando hay un “punto” al final de la url

Estoy usando ASP .NET MVC Beta y obtengo el error HTTP 404 (El recurso no se puede encontrar) cuando uso esta url que tiene un “punto” al final:

http: // localhost: 81 / Título / Editar / Código1 .

Si elimino el punto al final o el punto está en el medio, no obtengo el error.

Intenté depurar pero recibí el error de “System.Web.CachedPathData.GetConfigPathData (String configPath)” antes de ProcessRequest en MvcHandler.

¿No se permite “punto” al final de una url? ¿O hay una forma de arreglar la definición de ruta para manejar esta url?


Para un ejemplo: tengo una tabla llamada Detail1 [Id (integer), Code (string), Description (string)] que tiene una relación FK con Master1 a través de su columna Id. Cada vez que selecciono un registro de Master1, también selecciono su registro Detail1 para obtener su campo Code. Para no hacer que esto se una cada vez (ya que generalmente no hay solo un detalle, hay más de uno) elijo no usar la columna Id y hago el Código PK de Detalle1.

Pero cuando me deshago de Id y uso Code como PK, mis rutas también comienzan a funcionar con el campo Code, como por ejemplo: Detail1 \ Edit \ Code1

Este Código puede tener cualquier cosa en él o al final, incluido el DOT. Hay casos en los que puedo prohibir un DOT al final, pero a veces es realmente significativo.

Y también he visto esta publicación que las rutas pueden ser muy flexibles, así que no creo que la mía sea tan extraña.

Entonces, es por eso que hago algo que no es estándar. ¿Alguna sugerencia?

¿Y también por qué es tan extraño tener un DOT al final de una url?

Si usa .NET 4.0, puede establecer este indicador en la sección system.web de su web.config y se le permitirá:

 

Lo probé y funciona. Haack tiene una explicación de eso.

Esto se puede resolver de varias maneras en cada versión de ASP.NET de 1.0 en adelante. Sé que pasaron dos años desde la creación de este hilo, pero de todos modos, aquí va:

Porque

La creación de su manejador de error personalizado o la configuración de una página personalizada en IIS para redirigir el 404 no funcionarán. La razón es que ASP.NET considera que esta URL es peligrosa. Internamente en System.Web.Util.FileUtil , ASP.NET llama a un método privado IsSuspiciousPhysicalPath , que intenta mapear la ruta a un nombre de archivo (virtual pero legal).

Cuando la ruta legalizada resultante no es igual a la ruta original, el proceso se detiene y el código ASP.NET devuelve un 404 (no solicita IIS o web.config para el 404 personalizado, devuelve uno en sí mismo, lo que lo hace tan es difícil hacer algo al respecto).

Windows Explorer funciona de la misma manera. Intenta crear un nombre de archivo que termine en uno o más puntos, es decir, test.txt. . Descubrirá que el nombre resultante es text.txt .

Solución para finalizar URL en un punto en ASP.NET

La solución es simple (una vez que lo sabes, siempre lo es). Justo antes de enviar este 404, se llamará Application_PreSendRequestHeaders , un evento simple que puede registrarse en Global.asax.cs (o el equivalente de VB). El siguiente código devolverá un texto simple al navegador, pero también es posible una redirección o cualquier otra respuesta válida.

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e) { HttpResponse response = this.Context.Response; HttpRequest request = this.Context.Request; if (request.RawUrl.EndsWith(".")) { response.ClearContent(); response.StatusCode = 200; response.StatusDescription = "OK"; response.SuppressContent = false; response.ContentType = "text/plain"; response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!"); response.End(); } } 

Nota: este código también funciona cuando “aspx” no es parte de la URL. Es decir, http://example.com/app/somepath . llamará a ese evento. También tenga en cuenta que algunas rutas aún no funcionarán (terminando con múltiples puntos, con una etiqueta hash, o un signo <, por ejemplo, provoca una Solicitud 400-Mala). Por otra parte, funciona para finalizar con una comilla, un espacio + barra oblicua o varios puntos separados por espacios.

Bueno, en .NET 4.5 arreglé este problema agregando “/” al final de la url.

Entonces, en su caso, sería “http: // localhost: 81 / Title / Edit / Code1. /”. Fue lo único que hice, no tuve que agregar la configuración httpRuntime.

agregar esto a los controladores

    

Quizás http://localhost:81/Title/Edit/Code1%2E funcionaría.

Escapé del período con un código ascii hexadecimal.

¿Por qué no puedes tener un URI terminado en punto?

Debido a que un URI es una solicitud de recursos y existe una imperfección histórica en todos los sistemas operativos relevantes, el carácter de punto es el separador de extensiones . El último punto se trata como denotar una extensión de archivo, por lo tanto, la terminación de punto no tendrá sentido.

También vale la pena leer:

  • RFC1738
  • RFC3986