route net mvc examples attribute asp c# .net iis configuration routing

c# - mvc - ¿Cómo puedo redirigir y modificar URL sin extensión a través de ASP.NET?



route attribute asp net core (8)

Hemos rediseñado la estructura a un sitio web que tiene varias unidades de negocios. Ahora quiero redirigir (301) a la nueva página.

ES DECIR:
fue www.example.com/abc
ahora www.example.com/default.aspx?article=abc

Intenté usar Global.asax para hacer esto, y funciona correctamente cuando depuro a través de él.

if (Request.RawUrl.Contains("abc")) { Response.RedirectLocation = "/default.aspx?article=abc"; Response.StatusCode = 301; Response.StatusDescription = "Moved"; Response.End(); }

Así que http: // localhost: 1234 / example / abc redirige correctamente, pero (donde 1234 es el puerto para el servidor de depuración)
http: // localhost / example / abc no redirige, me da un 404.

¿Algunas ideas?

Información adicional: si voy a http: //localhost/example/abc/default.aspx , se redirige correctamente.


¿Actualmente estás probando el sitio en el servidor web de Visual Studio? Eso generalmente ejecuta el sitio en "localhost: nnnnn" donde "nnnnn" es un número de puerto (como el anterior es 1234), no lo configura para ejecutarse sin uno.

Si tienes IIS instalado en la máquina en cuestión, publícalo y deberías poder verificar que funciona sin el "nnnnn" ya que no parece haber nada en tu código que lo haga no hazlo.


¿Se ha asegurado de que los archivos web.config sean los mismos para cada sitio web (suponiendo que 1234 sea diferente a 80)?

Además, ¿has probado localhost: 80?


Bueno, si el puerto indica que está utilizando el servidor web incorporado (el que viene con VS), probablemente esto funcione porque eso siempre enruta las solicitudes a través del marco ASP.NET.

Las solicitudes que terminan en / abc no se enrutarán automáticamente a través del marco ASP.NET porque IIS puede que no "sepa" que usted desea. Debe verificar su configuración de IIS para asegurarse de que dichas solicitudes se enruten a aspnet_isapi.dll

EDITAR: para lograr esto, debe agregar una asignación de comodín :

  1. En el Administrador de IIS, expanda la computadora local, expanda la carpeta Sitios web, haga clic con el botón derecho en el sitio web o directorio virtual que desee y luego haga clic en Propiedades.
  2. Haga clic en la pestaña correspondiente: Directorio principal, Directorio virtual o Directorio.
  3. En el área Configuración de la aplicación, haga clic en Configuración y luego en la pestaña Asignaciones.
  4. Para instalar un mapa de aplicación de comodín, haga lo siguiente:
    • En la pestaña Asignaciones, haga clic en Agregar o Insertar.
    • Escriba la ruta a la DLL en el cuadro de texto Ejecutable o haga clic en Examinar para navegar hasta ella (por ejemplo, el dll de ASP.NET 2.0 está en c: / windows / microsoft.net / framework / v2.0.50727 / aspnet_isapi.dll en mi máquina)
    • Para la extensión, use ". *" Sin comillas, por supuesto
    • Seleccione qué verbos desea buscar (GET, HEAD, POST, DEPURACIÓN son los habituales para ASP.NET, usted decide)
    • Asegúrese de que esté seleccionado "Motor de secuencias de comandos" o "Motor de aplicaciones"
    • Desmarque "Comprobar que el archivo existe"
    • Haga clic en Aceptar

Puede que me vaya con esto, pero si lo estoy, espero que alguien me corrija. :)


Debe configurar una asignación de controlador en IIS para reenviar todas las extensiones desconocidas a asp.net. La primera funciona porque cassini está manejando todas las solicitudes, la segunda no funciona porque IIS está buscando ese directorio, y no existe, en lugar de que el framework .net ejecute el código que usted tiene.

Aquí hay información sobre cómo hacer la reescritura de la URL en asp.net .

Si es posible, sugeriría usar el nuevo enrutamiento de solicitud de aplicación o UrlRewrite.net


Debería usar la redirección de IIS comodín, necesitará algo como esto;

*; www.example.com/*; www.example.com/default.aspx?article=$0

Hay una referencia razonable en Microsoft

Si usa Apache, creo que deberá modificar el archivo htaccess.


IIS, de forma predeterminada, no entrega todas las solicitudes a ASP.NET para su manejo. Solo algunas extensiones de recursos, entre ellas "aspx" pasarán a asp.net para su manejo. Lo que sucede cuando solicita http: // localhost / example / abc es que IIS intenta ubicar el directorio para ver si tiene un archivo predeterminado (es decir, default.aspx, index.html) para cargar desde ese directorio. Como no puede encontrar el directorio con la etiqueta no deseada "abc", nunca encuentra el archivo default.aspx para cargar.

Cuando intenta cargar http: //localhost/example/abc/default.aspx , IIS ve la extensión "aspx" y la entrega inmediatamente al tiempo de ejecución de ASP.NET para su manejo. El motivo por el que no se carga la solicitud http: // localhost / example / abc es que nunca se entrega a ASP.NET, por lo que, por supuesto, el archivo.asax nunca lo ve.

El sitio alojado de Cassini maneja todas las solicitudes, por lo tanto, ASP.NET y el archivo global.asax manejan esa llamada.

Estoy de acuerdo con Darren Kopp, quien sugirió que debe configurar la asignación de Handler en IIS para reenviar extensiones desconocidas a ASP.NET.