Est-il possible d'avoir une route ASP.NET MVC qui utilise les informations de sous-domaine pour déterminer sa route? Par exemple:
- user1 .domaine.com va à un seul endroit
- user2 .domain.com passe à un autre?
Ou, puis-je faire en sorte que les deux vont au même contrôleur / action avec un username
paramètre?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
la source
la source
Réponses:
Vous pouvez le faire en créant un nouvel itinéraire et en l'ajoutant à la collection d'itinéraires dans RegisterRoutes dans votre global.asax. Voici un exemple très simple d'un itinéraire personnalisé:
la source
Pour capturer le sous-domaine tout en conservant les fonctionnalités de routage MVC5 standard , utilisez la
SubdomainRoute
classe suivante dérivée deRoute
.En outre,
SubdomainRoute
permet éventuellement de spécifier le sous-domaine en tant que paramètre de requête , faisantsub.example.com/foo/bar
etexample.com/foo/bar?subdomain=sub
équivalent. Cela vous permet de tester avant de configurer les sous-domaines DNS. Le paramètre de requête (lorsqu'il est utilisé) est propagé via de nouveaux liens générés parUrl.Action
, etc.Le paramètre de requête permet également le débogage local avec Visual Studio 2013 sans avoir à configurer avec netsh ou à exécuter en tant qu'administrateur . Par défaut, IIS Express ne se lie à localhost que lorsqu'il n'est pas élevé; il ne se liera pas aux noms d'hôte comme sub.localtest.me .
Pour plus de commodité, appelez la
MapSubdomainRoute
méthode suivante à partir de votreRegisterRoutes
méthode, comme vous le feriez tout simplementMapRoute
:Enfin, pour accéder facilement au sous-domaine (à partir d'un vrai sous-domaine ou d'un paramètre de requête), il est utile de créer une classe de base Controller avec cette
Subdomain
propriété:la source
Ce n'est pas mon travail, mais j'ai dû l'ajouter à cette réponse.
Voici une excellente solution à ce problème. Maartin Balliauw a écrit du code qui crée une classe DomainRoute qui peut être utilisée de manière très similaire au routage normal.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Exemple d'utilisation serait comme ça ...
;
la source
SERVER NOT FOUND
erreur ... signifie que le code ne fonctionne pas pour moi ... définissez-vous une autre configuration ou quelque chose?!Pour capturer le sous-domaine lors de l'utilisation de l' API Web , remplacez le sélecteur d'action pour injecter un
subdomain
paramètre de requête. Utilisez ensuite le paramètre de requête de sous-domaine dans les actions de vos contrôleurs comme ceci:Cette approche rend le débogage pratique car vous pouvez spécifier le paramètre de requête à la main lorsque vous utilisez localhost au lieu du nom d'hôte réel (voir la réponse de routage MVC5 standard pour plus de détails). Voici le code du sélecteur d'action:
Remplacez le sélecteur d'action par défaut en l'ajoutant à
WebApiConfig.Register
:la source
Oui mais vous devez créer votre propre gestionnaire d'itinéraire.
En règle générale, la route ne connaît pas le domaine, car l'application peut être déployée sur n'importe quel domaine et la route s'en moque d'une manière ou d'une autre. Mais dans votre cas, vous voulez baser le contrôleur et l'action hors du domaine, vous devrez donc créer une route personnalisée qui connaît le domaine.
la source
J'ai créé une bibliothèque pour le routage de sous-domaine que vous pouvez créer un tel itinéraire. Il fonctionne actuellement pour un .NET Core 1.1 et .NET Framework 4.6.1 mais sera mis à jour dans un proche avenir. Voici comment cela fonctionne:
1) Mapper la route du sous-domaine dans Startup.cs
2) Contrôleurs / HomeController.cs
3) Cette bibliothèque vous permettra également de générer des URL et des formulaires. Code:
Générerons
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL générée dépendra également de l'emplacement de l' hôte actuel et le schéma.Vous pouvez également utiliser des assistants html pour
BeginForm
etUrlHelper
. Si vous le souhaitez, vous pouvez également utiliser une nouvelle fonctionnalité appelée helpers de balises (FormTagHelper
,AnchorTagHelper
)Cette bibliothèque n'a pas encore de documentation, mais il existe des tests et des exemples de projets, alors n'hésitez pas à l'explorer.
la source
Dans ASP.NET Core , l'hôte est disponible via
Request.Host.Host
. Si vous souhaitez autoriser la substitution de l'hôte via un paramètre de requête, vérifiez d'abordRequest.Query
.Pour provoquer la propagation d'un paramètre de requête hôte vers de nouvelles URL basées sur l'
app.UseMvc
itinéraire , ajoutez ce code à la configuration de l' itinéraire:Et définissez
HostPropagationRouter
comme ceci:la source
Après avoir défini un nouveau gestionnaire de route qui examinerait l'hôte transmis dans l'URL , vous pouvez partir avec l'idée d'un contrôleur de base qui connaît le site auquel il accède. Cela ressemble à ceci:
ISiteProvider
est une interface simple:Je vous réfère, allez sur le blog de Luke Sampson
la source
Si vous cherchez à donner des capacités MultiTenancy à votre projet avec différents domaines / sous-domaines pour chaque locataire, vous devriez jeter un œil à SaasKit:
https://github.com/saaskit/saaskit
Des exemples de code peuvent être consultés ici: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Quelques exemples utilisant le noyau ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDIT: Si vous ne souhaitez pas utiliser SaasKit dans votre projet principal ASP.NET, vous pouvez consulter la mise en œuvre de Maarten du routage de domaine pour MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain -routage-et-résolution-locataire-actuel-avec-aspnet-mvc-6-aspnet-5.html
Cependant, ces Gists ne sont pas maintenus et doivent être modifiés pour fonctionner avec la dernière version du noyau ASP.NET.
Lien direct vers le code: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
la source
Il y a quelques mois, j'ai développé un attribut qui restreint les méthodes ou les contrôleurs à des domaines spécifiques.
Il est assez simple à utiliser:
Vous pouvez également l'appliquer directement sur un contrôleur.
Restriction: vous ne pourrez peut-être pas avoir deux mêmes itinéraires sur des méthodes différentes avec des filtres différents. Je veux dire que les éléments suivants peuvent lever une exception pour l'itinéraire en double:
la source