É possível ter uma rota ASP.NET MVC que usa informações de subdomínio para determinar sua rota? Por exemplo:
- O usuário1 .domínio.com vai para um local
- user2 .domínio.com vai para outro?
Ou posso fazê-lo para que ambos passem para o mesmo controlador / ação com um username
parâmetro?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
fonte
fonte
Respostas:
Você pode fazer isso criando uma nova rota e adicionando-a à coleção de rotas em RegisterRoutes no seu global.asax. Abaixo está um exemplo muito simples de uma rota personalizada:
fonte
Para capturar o subdomínio enquanto mantém os recursos de roteamento MVC5 padrão , use a seguinte
SubdomainRoute
classe derivada deRoute
.Além disso,
SubdomainRoute
permite que o subdomínio seja opcionalmente especificado como um parâmetro de consulta , makingsub.example.com/foo/bar
eexample.com/foo/bar?subdomain=sub
equivalente. Isso permite que você teste antes da configuração dos subdomínios DNS. O parâmetro de consulta (quando em uso) é propagado por novos links gerados porUrl.Action
etc.O parâmetro query também habilita a depuração local com o Visual Studio 2013 sem precisar configurar com netsh ou executar como administrador . Por padrão, o IIS Express se liga apenas ao host local quando não é elevado; não será vinculado a nomes de host sinônimos como sub.localtest.me .
Por conveniência, chame o seguinte
MapSubdomainRoute
método a partir do seuRegisterRoutes
método, exatamente como você fariaMapRoute
:Por fim, para acessar convenientemente o subdomínio (de um subdomínio verdadeiro ou de um parâmetro de consulta), é útil criar uma classe base do Controller com esta
Subdomain
propriedade:fonte
Este não é o meu trabalho, mas tive que adicioná-lo nesta resposta.
Aqui está uma ótima solução para esse problema. Maartin Balliauw escreveu um código que cria uma classe DomainRoute que pode ser usada de maneira muito semelhante ao roteamento normal.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
O uso da amostra seria assim ...
;
fonte
SERVER NOT FOUND
erro ... significa que o código não está funcionando para mim ... você está definindo alguma outra configuração ou algo assim ?!Para capturar o subdomínio ao usar a API da Web , substitua o Seletor de ações para injetar um
subdomain
parâmetro de consulta. Em seguida, use o parâmetro de consulta de subdomínio nas ações de seus controladores como este:Essa abordagem torna a depuração conveniente, pois você pode especificar manualmente o parâmetro de consulta ao usar o host local em vez do nome do host real (consulte a resposta de roteamento MVC5 padrão para obter detalhes). Este é o código do Action Selector:
Substitua o Seletor de Ação padrão adicionando isto a
WebApiConfig.Register
:fonte
Sim, mas você precisa criar seu próprio manipulador de rotas.
Normalmente, a rota não está ciente do domínio porque o aplicativo pode ser implantado em qualquer domínio e a rota não se importa com uma maneira ou outra. Mas, no seu caso, você deseja basear o controlador e a ação fora do domínio, portanto, será necessário criar uma rota personalizada que esteja ciente do domínio.
fonte
Eu criei uma biblioteca para roteamento de subdomínio, que você pode criar essa rota. Atualmente, ele está trabalhando para o .NET Core 1.1 e o .NET Framework 4.6.1, mas será atualizado em breve. É assim que funciona:
1) Mapeie a rota do subdomínio no Startup.cs
2) Controladores / HomeController.cs
3) Essa lib também permitirá gerar URLs e formulários. Código:
Irá gerar
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL gerado também dependerá da localização e esquema atuais do host.Você também pode usar ajudantes html para
BeginForm
eUrlHelper
. Se você quiser, também pode usar o novo recurso chamado tag helpers (FormTagHelper
,AnchorTagHelper
)Essa lib ainda não possui nenhuma documentação, mas existem alguns testes e amostras de projeto, então fique à vontade para explorá-lo.
fonte
No ASP.NET Core , o host está disponível via
Request.Host.Host
. Se você deseja permitir a substituição do host por meio de um parâmetro de consulta, verifique primeiroRequest.Query
.Para fazer com que um parâmetro de consulta de host seja propagado para novos URLs baseados em rota, adicione este código à
app.UseMvc
configuração de rota:E defina
HostPropagationRouter
assim:fonte
Depois de definir um novo manipulador de rota que examinaria o host transmitido na URL , você pode ter a idéia de um controlador base que esteja ciente do site para o qual está sendo acessado. Se parece com isso:
ISiteProvider
é uma interface simples:Eu indico que você vá para o Luke Sampson Blog
fonte
Se você deseja fornecer recursos de MultiTenancy ao seu projeto com diferentes domínios / subdomínios para cada inquilino, consulte o SaasKit:
https://github.com/saaskit/saaskit
Exemplos de código podem ser vistos aqui: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Alguns exemplos usando o núcleo do ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDIT: Se você não deseja usar o SaasKit em seu projeto principal do ASP.NET, pode dar uma olhada na implementação de Maarten do roteamento de domínio para MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain -routing-and-resolving-current-tenant-with-aspnet-mvc-6-aspnet-5.html
No entanto, essas listas não são mantidas e precisam ser aprimoradas para funcionar com a versão mais recente do núcleo do ASP.NET.
Link direto para o código: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
fonte
Há alguns meses, desenvolvi um atributo que restringe métodos ou controladores a domínios específicos.
É bastante fácil de usar:
Você também pode aplicá-lo diretamente em um controlador.
Restrição: talvez você não consiga ter duas rotas iguais em métodos diferentes com filtros diferentes. Quero dizer que o seguinte pode gerar uma exceção para rota duplicada:
fonte