¿Es posible tener una ruta ASP.NET MVC que use información de subdominio para determinar su ruta? Por ejemplo:
- user1 .domain.com va a un lugar
- user2 .domain.com va a otro?
¿O puedo hacerlo para que ambos vayan al mismo controlador / acción con un username
parámetro?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
fuente
fuente
Respuestas:
Puede hacerlo creando una nueva ruta y agregándola a la colección de rutas en RegisterRoutes en su global.asax. A continuación se muestra un ejemplo muy simple de una ruta personalizada:
fuente
Para capturar el subdominio mientras se conservan las características de enrutamiento MVC5 estándar , use la siguiente
SubdomainRoute
clase derivada deRoute
.Además,
SubdomainRoute
permite que el subdominio se especifique opcionalmente como un parámetro de consulta , creaciónsub.example.com/foo/bar
yexample.com/foo/bar?subdomain=sub
equivalente. Esto le permite probar antes de configurar los subdominios DNS. El parámetro de consulta (cuando está en uso) se propaga a través de nuevos enlaces generados porUrl.Action
, etc.El parámetro de consulta también permite la depuración local con Visual Studio 2013 sin tener que configurarlo con netsh o ejecutarlo como Administrador . Por defecto, IIS Express solo se une a localhost cuando no está elevado; no se unirá a nombres de host como sub.localtest.me .
Para mayor comodidad, llame al siguiente
MapSubdomainRoute
método desde suRegisterRoutes
método tal como lo haría con el viejoMapRoute
:Finalmente, para acceder convenientemente al subdominio (ya sea desde un subdominio verdadero o un parámetro de consulta), es útil crear una clase base de Controlador con esta
Subdomain
propiedad:fuente
Este no es mi trabajo, pero tuve que agregarlo en esta respuesta.
Aquí hay una gran solución a este problema. Maartin Balliauw escribió un código que crea una clase DomainRoute que puede usarse de manera muy similar al enrutamiento normal.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
El uso de la muestra sería así ...
;
fuente
SERVER NOT FOUND
error ... significa que el código no funciona para mí ... ¿está configurando alguna otra configuración o algo así?Para capturar el subdominio cuando se usa la API web , anule el selector de acción para inyectar un
subdomain
parámetro de consulta. Luego use el parámetro de consulta de subdominio en las acciones de sus controladores de esta manera:Este enfoque hace que la depuración sea conveniente ya que puede especificar el parámetro de consulta manualmente cuando usa localhost en lugar del nombre de host real (consulte la respuesta de enrutamiento MVC5 estándar para obtener más detalles). Este es el código para el Selector de acciones:
Reemplace el selector de acción predeterminado agregando esto a
WebApiConfig.Register
:fuente
Sí, pero debe crear su propio controlador de ruta.
Por lo general, la ruta no conoce el dominio porque la aplicación podría implementarse en cualquier dominio y la ruta no importaría de una forma u otra. Pero en su caso, desea basar el controlador y la acción fuera del dominio, por lo que tendrá que crear una ruta personalizada que conozca el dominio.
fuente
Creé una biblioteca para el enrutamiento del subdominio, que puede crear dicha ruta. Actualmente está trabajando para .NET Core 1.1 y .NET Framework 4.6.1, pero se actualizará en un futuro próximo. Así es como funciona:
1) Mapa de ruta de subdominio en Startup.cs
2) Controladores / HomeController.cs
3) Esa biblioteca también te permitirá generar URL y formularios. Código:
Generará
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL generada también dependerá de la ubicación actual anfitrión y el esquema.También puede usar html helpers para
BeginForm
yUrlHelper
. Si lo desea, también puede usar una nueva función llamada ayudantes de etiqueta (FormTagHelper
,AnchorTagHelper
)Esa biblioteca todavía no tiene documentación, pero hay algunas pruebas y proyectos de muestra, así que no dude en explorarla.
fuente
En ASP.NET Core , el host está disponible a través de
Request.Host.Host
. Si desea permitir anular el host mediante un parámetro de consulta, primero verifiqueRequest.Query
.Para hacer que un parámetro de consulta de host se propague a nuevas URL basadas en rutas, agregue este código a la
app.UseMvc
configuración de la ruta:Y definir
HostPropagationRouter
así:fuente
Después de definir un nuevo controlador de ruta que vería el host pasado en la URL , puede ir con la idea de un controlador base que conozca el sitio al que se está accediendo. Se parece a esto:
ISiteProvider
es una interfaz simple:Os recomiendo que vayan al blog de Luke Sampson
fuente
Si está buscando dar capacidades de MultiTenancy a su proyecto con diferentes dominios / subdominios para cada inquilino, debe echar un vistazo a SaasKit:
https://github.com/saaskit/saaskit
Los ejemplos de código se pueden ver aquí: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Algunos ejemplos que usan el núcleo ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDITAR: si no desea utilizar SaasKit en su proyecto principal de ASP.NET, puede echar un vistazo a la implementación de Maarten de enrutamiento de dominio para MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain -rutamiento-y-resolución-actual-inquilino-con-aspnet-mvc-6-aspnet-5.html
Sin embargo, esos Gists no se mantienen y deben modificarse para que funcionen con la última versión del núcleo ASP.NET.
Enlace directo al código: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
fuente
Hace unos meses desarrollé un atributo que restringe los métodos o controladores a dominios específicos.
Es muy fácil de usar:
También puede aplicarlo directamente en un controlador.
Restricción: es posible que no pueda tener dos mismas rutas en diferentes métodos con diferentes filtros. Quiero decir, lo siguiente puede arrojar una excepción para rutas duplicadas:
fuente