Est-il possible de faire une ASP.NET MVC itinéraire basé sur un sous-domaine?
Est-il possible d'avoir un ASP.NET MVC itinéraire qui utilise un sous-domaine de l'information afin de déterminer son itinéraire? Par exemple:
- user1.domain.com va à un endroit
- user2.domain.com va à l'autre?
Ou, puis-je faire à la fois de ces aller pour le même contrôleur/action avec un username
paramètre?
- J'ai mis en place une sorte semblable de chose pour le multi-tenanted les applications, mais en utilisant un résumé de Contrôleur de base plutôt que d'une classe de Route personnalisée. Mon blog sur c'est ici.
- Soyez sûr d'envisager cette approche: http://blog.tonywilliams.me.uk/asp-net-mvc-2-routing-subdomains-to-areas je l'ai trouvé mieux pour l'introduction de multilocataire de mon application que les autres réponses, car MVC domaines sont une belle façon d'introduire locataire spécifiques les contrôleurs et les vues d'une manière organisée.
- Je pense que vous devriez ajouter une réponse, c'est ce que j'ai utilisé comme base pour ma solution.
- Merci. C'était une réponse, mais un modérateur l'a converti en un commentaire pour des raisons que je ne comprends pas.
- Tony est comme brisé. En voici une qui a fonctionné pour moi: blog.tonywilliams.moi.royaume-uni/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire par la création d'une nouvelle route et l'ajouter à la collection itinéraires en RegisterRoutes dans votre global.asax. Ci-dessous est un exemple très simple d'un Itinéraire personnalisé:
À de capture de la sous-domaine tout en conservant la norme MVC5 des fonctionnalités de routage, utilisez la commande suivante
SubdomainRoute
classe dérivée deRoute
.En outre,
SubdomainRoute
permet le sous-domaine éventuellement être spécifié comme un paramètre de requête, fairesub.example.com/foo/bar
etexample.com/foo/bar?subdomain=sub
équivalent. Cela vous permet de tester avant de les sous-domaines DNS sont configurés. Le paramètre de requête (lorsqu'en service) est multiplié par le biais de nouveaux liens générés parUrl.Action
, etc.Le paramètre de requête permet également de débogage locale avec Visual Studio 2013, sans avoir à configurer avec netsh ou exécuter en tant qu'Administrateur. Par défaut, IIS Express ne lie localhost lorsque la non-élevée; il ne se lient pas à la synonymes de noms d'hôtes comme sous.localtest.moi.
Pour des raisons de commodité, appeler le
MapSubdomainRoute
méthode de votreRegisterRoutes
méthode, comme vous le feriez un bon vieuxMapRoute
:Enfin, pour accéder facilement aux sous-domaine (que ce soit à partir d'un vrai sous-domaine ou un paramètre de requête), il est utile de créer un Contrôleur de la classe de base avec ce
Subdomain
propriété:Ce n'est pas mon travail, mais j'ai dû l'ajouter sur cette réponse.
Ici est une excellente solution à ce problème. Maartin Balliauw écrit le code qui crée un DomainRoute classe qui peut être utilisé de façon très similaire à la normale de routage.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Exemple d'utilisation serait comme ça...
;
SERVER NOT FOUND
erreur... signifie que le code ne fonctionne pas pour moi... vous le mettre n'importe quelle autre configuration ou quelque chose?!Pour capturer le sous-domaine lors de l'utilisation de API Web, remplacer l'Action Sélecteur d'injecter un
subdomain
paramètre de requête. Ensuite, utiliser le sous-domaine paramètre de requête dans vos controllers' actions comme ceci:Cette approche rend le débogage pratique car vous pouvez spécifier le paramètre de requête à la main lors de l'utilisation de localhost au lieu du nom de l'hôte (voir le standard MVC5 de routage répondre pour plus de détails). Ceci est le code de l'Action Sélecteur:
Remplacer l'Action par défaut Sélecteur en ajoutant ceci à
WebApiConfig.Register
:Oui, mais vous devez créer votre propre gestionnaire d'itinéraire.
Généralement la route n'est pas au courant de la le domaine, car l'application peut être déployée n'importe quel domaine et la route ne serait pas de soins d'une façon ou d'une autre. Mais dans votre cas vous souhaitez baser le contrôleur et l'action sur le domaine, de sorte que vous aurez à créer un itinéraire personnalisé, qui est conscient du domaine.
J'ai créé bibliothèque de sous-domaine de routage lequel vous pouvez créer un itinéraire. Il travaille actuellement pour une .NET de Base 1.1 et .NET Framework 4.6.1 mais sera mis à jour dans un avenir proche. C'est de cette manière est-il de travail:
1) la Carte de sous-domaine de l'itinéraire en Démarrage.cs
2) Contrôleurs/Contrôleur HomeController.cs
3) Que lib vous permettra également de générer des Url et des formes. Code:
Va générer
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL générée dépendra aussi actuel lieu d'accueil et de schéma.
Vous pouvez également utiliser de l'html helpers pour
BeginForm
etUrlHelper
. Si vous le souhaitez, vous pouvez également utiliser la nouvelle fonctionnalité appelée balise aides (FormTagHelper
,AnchorTagHelper
)Cette lib n'a pas de documentation pour l'instant, mais il existe certains tests et échantillons projet alors n'hésitez pas à l'explorer.
Dans ASP.NET Core, l'hôte est disponible via
Request.Host.Host
. Si vous souhaitez autoriser la substitution de l'hôte par l'intermédiaire d'un paramètre de requête, vérifiez d'abordRequest.Query
.À cause d'un hôte paramètre de requête de se propager dans de nouvelles routes Url, ajoutez ce code à la
app.UseMvc
route de configuration:Et de définir
HostPropagationRouter
comme ceci:Après la définition d'un nouveau gestionnaire d'Itinéraire sur le pays hôte est passé dans l'URL, vous pouvez aller avec l'idée d'un Contrôleur de base qui est de l'existence du Site, il est accessible pour. Il ressemble à ceci:
ISiteProvider
est une interface simple:Je vous renvoie aller à Luc Sampson Blog
Si vous cherchez à donner Multilocataire les capacités de votre projet avec les différents domaines/sous-domaines pour chaque locataire, vous devriez jeter un oeil à SaasKit:
https://github.com/saaskit/saaskit
Exemples de Code peut être vu ici: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Quelques exemples d'utilisation de ASP.NET core: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDIT:
Si vous ne voulez pas utiliser SaasKit dans votre ASP.NET projet de base, vous pouvez avoir un coup d'oeil à Martin de la mise en œuvre du domaine de routage pour MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain-routing-and-resolving-current-tenant-with-aspnet-mvc-6-aspnet-5.html
Toutefois, ces Fondements ne sont pas maintenus et ont besoin d'être modifié pour fonctionner avec la dernière version de ASP.NET de base.
Lien Direct vers le code: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
Y a quelques mois, j'ai développé un attribut qui limite les méthodes ou les contrôleurs de domaines spécifiques.
Il est très facile à utiliser:
Vous pouvez également l'appliquer directement sur le contrôleur.
Restriction:
vous ne pouvez pas être en mesure d'avoir les deux mêmes types de routes sur des méthodes différentes avec des filtres
Je veux dire que le suivant peut lancer une exception pour la copie de l'itinéraire: