¿Cuál es la diferencia entre HttpRequest.Path y HttpRequest.PathBase en ASP.NET Core?

8

Como se detalla aquí: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httprequest?view=aspnetcore-3.0 , la HttpRequestclase de ASP.NET Core incluye ambos Pathy PathBasepropiedades.

¿Cuál es la diferencia entre estas dos propiedades? ¿Para qué se usa cada uno? ¿Cuál es el significado de PathBase? ¿Cuál es el significado de tener tanto a Pathcomo a PathBase?

No puedo encontrar ninguna documentación que detalle por qué es como es, ¿alguna idea?

James Law
fuente

Respuestas:

18

En ASP.NET core existe este concepto conocido como la base de ruta . La idea básica es bastante fácil de entender: la base de ruta se considera un prefijo fijo para la ruta de todas las solicitudes entrantes a su aplicación web. Por defecto, la base de la ruta se considera la cadena vacía.

Esto significa que, de forma predeterminada, cuando una solicitud ingresa a su aplicación, toda la parte de la ruta de la URL de la solicitud se asignará a la Pathpropiedad del HttpRequestobjeto y la PathBasepropiedad se establecerá enstring.empty .

Como ejemplo, considere una aplicación principal de asp.net que se ejecuta en su máquina local y escucha el puerto 3000. Suponga que está ejecutando la aplicación utilizando el servidor web raw kestrel (por lo que no hay un proxy inverso involucrado, las solicitudes llegan directamente a kestrel).

Cuando solicite la URL http://localhost:3000/foo/bar, el HttpRequestobjeto tendrá las siguientes propiedades:

  • HttpRequest.Path se establecerá en /foo/bar
  • HttpRequest.PathBase se establecerá en string.empty

Obtendrá la misma situación cuando decida alojar su aplicación en Azure, utilizando un servicio de aplicaciones de Windows.

En este escenario de alojamiento, el valor predeterminado para una aplicación web central ASP.NET se ejecuta dentro del mismo proceso que el proceso de trabajo de IIS. Esto básicamente significa que solo hay un proceso involucrado; de nuevo, no hay proxy inverso y el servidor web kestrel no se utiliza en absoluto: la solicitud es manejada por IIS directamente (puede encontrar algunos detalles aquí si está interesado).

En ese caso, la URL pública para su aplicación será algo así https://my-application.azurewebsites.net. Cuando navega a la URL https://my-application.azurewebsites.net/foo/bar, la situación para la solicitud HTTP entrante será la siguiente:

  • HttpRequest.Path se establecerá en /foo/bar
  • HttpRequest.PathBase se establecerá en string.empty

De nuevo, como antes, la base del camino es la cadena vacía.

Existen diferentes escenarios de alojamiento en los que puede decidir exponer su aplicación utilizando un directorio virtual.

Por ejemplo, puede decidir alojar la aplicación web básica asp.net en su propio centro de datos utilizando una máquina virtual de Windows con IIS instalado. En ese caso, es posible que tenga un sitio web existente en IIS y desee crear una aplicación virtual que tenga un alias adecuado en ese sitio web. Nuevamente en este escenario, como se explicó anteriormente para el servicio de la aplicación de Windows azul, no hay un proxy inverso involucrado y el servidor web kestrel no se usa en absoluto: la solicitud es manejada directamente por el proceso de trabajo de IIS ( en el modelo de proceso de alojamiento ).

Suponga que la URL pública de su sitio web es https://sample-application.contoso.nety que ha elegido el sample-aliascomo el alias para la aplicación virtual. Esto implica que todas las solicitudes a su aplicación web básica asp.net tendrán una parte de ruta que comenzará sample-alias. Por ejemplo, cuando desee solicitar la página de inicio de su aplicación, buscará https://sample-application.contoso.net/sample-alias.

En este caso, cuando solicite la URL https://sample-application.contoso.net/sample-alias/foo/bar, el HttpRequestobjeto en su aplicación se realizará de la siguiente manera:

  • HttpRequest.Path se establecerá en /foo/bar
  • HttpRequest.PathBase se establecerá en sample-alias

Debido a la forma en que se construye el host web predeterminado para una aplicación principal ASP.NET, este escenario que involucra aplicaciones virtuales de IIS funciona de inmediato y la tubería de middleware es consciente del prefijo común a todas las solicitudes HTTP entrantes y es capaz de establezca la base de ruta sample-aliasy la propiedad de ruta a la parte restante de la ruta de la solicitud entrante ( /foo/baren mi ejemplo anterior).

Como regla general, puede considerar que una aplicación web central ASP.NET funciona bien sin ninguna configuración adicional cuando desee alojarla mediante IIS. Esto también es cierto para la propiedad base de ruta (marque aquí para verificar que la ruta base de solicitud se establece automáticamente dentro de su aplicación en la estrategia).

Como último ejemplo, considere alojar su aplicación en una máquina Linux, usando nginx como proxy inverso. En este caso, su aplicación se ejecutará dentro del servidor web de Kestrel, pero no estará directamente expuesta a Internet público. Lo que está expuesto a Internet público es el servidor web nginx que enruta las solicitudes HTTP entrantes al servidor web kestrel (donde se ejecuta su aplicación). Puede decidir configurar su nginx para que todas las solicitudes que comiencen por el prefijo /awesome-applicationse enruten a su aplicación web principal asp.net.

Como ejemplo, suponga exponer nginx a Internet público en la URL https://ingress.contoso.net: en este caso, si desea solicitar la página de inicio de su aplicación, debe buscarla https://ingress.contoso.net/awesome-application/.

En este caso, no puede obtener la awesome-applicationbase de ruta de solicitud de forma gratuita (de forma predeterminada, kestrel no lo conoce y considera que la base de ruta de solicitud es string.empty).

Para que Kestrel conozca la base de la ruta de solicitud, debe usar UsePathBaseMiddleware como primer elemento en su canalización de middleware.

Si necesita más detalles para este caso, siga esta documentación y vea también esta pregunta de stackoverflow .

Enrico Massone
fuente
1
Hay un poco más de esto: uso, ejecución y mapa . Por ejemplo: cuando Mapse usa, los segmentos de ruta coincidentes se eliminan HttpRequest.Pathy se agregan a HttpRequest.PathBasecada solicitud. .
Kirk Larkin