Ist es möglich, eine ASP.NET MVC-Route zu haben, die Subdomain-Informationen verwendet, um ihre Route zu bestimmen? Beispielsweise:
- user1 .domain.com geht an einen Ort
- user2 .domain.com geht zu einem anderen?
Oder kann ich es so machen, dass beide mit einem username
Parameter zur gleichen Steuerung / Aktion gehen ?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
quelle
quelle
Antworten:
Sie können dies tun, indem Sie eine neue Route erstellen und sie der Routensammlung in RegisterRoutes in Ihrer global.asax hinzufügen. Unten finden Sie ein sehr einfaches Beispiel für eine benutzerdefinierte Route:
quelle
Verwenden Sie die folgende von abgeleitete Klasse, um die Subdomain unter Beibehaltung der Standard-MVC5-Routingfunktionen zu erfassen .
SubdomainRoute
Route
Darüber hinaus
SubdomainRoute
ermöglicht es die Sub - Domain optional als angegeben werden Abfrageparameter , wassub.example.com/foo/bar
undexample.com/foo/bar?subdomain=sub
gleichwertig. Auf diese Weise können Sie testen, bevor die DNS-Subdomänen konfiguriert werden. Der Abfrageparameter (wenn verwendet) wird über neue Links weitergegeben, die vonUrl.Action
usw. generiert wurden.Der Abfrageparameter ermöglicht auch das lokale Debuggen mit Visual Studio 2013, ohne mit netsh konfigurieren oder als Administrator ausgeführt werden zu müssen . Standardmäßig bindet IIS Express nur dann an localhost, wenn es nicht erhöht ist. es wird auch nicht an hostnamen wie gebunden sub.localtest.me gebunden .
Rufen Sie zur Vereinfachung Folgendes an
MapSubdomainRoute
Methode aus IhrerRegisterRoutes
Methode auf, so wie Sie es einfach alt machen würdenMapRoute
:Um bequem auf die Subdomain zugreifen zu können (entweder über eine echte Subdomain oder einen Abfrageparameter), ist es hilfreich, eine Controller-Basisklasse mit dieser
Subdomain
Eigenschaft zu erstellen :quelle
Dies ist nicht meine Arbeit, aber ich musste sie zu dieser Antwort hinzufügen.
Hier ist eine großartige Lösung für dieses Problem. Maartin Balliauw hat Code geschrieben, der eine DomainRoute-Klasse erstellt, die sehr ähnlich wie das normale Routing verwendet werden kann.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Beispielgebrauch wäre so ...
;;
quelle
SERVER NOT FOUND
Fehlermeldung ... bedeutet, dass der Code bei mir nicht funktioniert ... stellen Sie eine andere Konfiguration ein oder so?!Um die Subdomain bei Verwendung der Web-API zu erfassen , überschreiben Sie die Aktionsauswahl, um einen
subdomain
Abfrageparameter einzufügen. Verwenden Sie dann den Abfrageparameter für die Subdomain in den Aktionen Ihrer Controller wie folgt:Dieser Ansatz erleichtert das Debuggen, da Sie den Abfrageparameter manuell angeben können, wenn Sie localhost anstelle des tatsächlichen Hostnamens verwenden ( Einzelheiten finden Sie in der Standard-MVC5-Routing-Antwort ). Dies ist der Code für die Aktionsauswahl:
Ersetzen Sie die Standard-Aktionsauswahl, indem Sie diese hinzufügen
WebApiConfig.Register
:quelle
Ja, aber Sie müssen Ihren eigenen Routen-Handler erstellen.
Normalerweise kennt die Route die Domäne nicht, da die Anwendung für jede Domäne bereitgestellt werden kann und die Route auf die eine oder andere Weise keine Rolle spielt. In Ihrem Fall möchten Sie den Controller und die Aktion jedoch außerhalb der Domäne einrichten, sodass Sie eine benutzerdefinierte Route erstellen müssen, die die Domäne kennt.
quelle
Ich habe eine Bibliothek für das Subdomain-Routing erstellt, mit der Sie eine solche Route erstellen können. Es funktioniert derzeit für .NET Core 1.1 und .NET Framework 4.6.1, wird jedoch in naher Zukunft aktualisiert. So funktioniert es:
1) Ordnen Sie die Subdomain-Route in Startup.cs zu
2) Controller / HomeController.cs
3) Mit dieser Bibliothek können Sie auch URLs und Formulare generieren. Code:
Die generierte
<a href="http://user1.localhost:54575/Home/Index">User home</a>
URL wird auch vom aktuellen Hostspeicherort und -schema abhängen.Sie können auch HTML-Helfer für
BeginForm
und verwendenUrlHelper
. Wenn Sie möchten, können Sie auch die neue Funktion tag helpers (FormTagHelper
,AnchorTagHelper
) verwenden.Diese Bibliothek verfügt noch über keine Dokumentation, es gibt jedoch einige Test- und Beispielprojekte. Sie können sie also gerne erkunden.
quelle
In ASP.NET Core ist der Host über verfügbar
Request.Host.Host
. Wenn Sie das Überschreiben des Hosts über einen Abfrageparameter zulassen möchten, überprüfen Sie zunächstRequest.Query
.Fügen Sie diesen Code zur Routenkonfiguration hinzu, damit ein Host-Abfrageparameter an neue routenbasierte URLs weitergegeben wird
app.UseMvc
:Und so definieren
HostPropagationRouter
:quelle
Nachdem Sie einen neuen Route-Handler definiert haben, der sich mit dem in der URL übergebenen Host befasst , können Sie sich für einen Basis-Controller entscheiden, der die Site kennt, auf die zugegriffen wird. Es sieht aus wie das:
ISiteProvider
ist eine einfache Schnittstelle:Ich verweise Sie gehen zu Luke Sampson Blog
quelle
Wenn Sie Ihrem Projekt MultiTenancy-Funktionen mit unterschiedlichen Domänen / Subdomänen für jeden Mandanten geben möchten, sollten Sie sich SaasKit ansehen:
https://github.com/saaskit/saaskit
Codebeispiele finden Sie hier: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Einige Beispiele für die Verwendung des ASP.NET-Kerns: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
BEARBEITEN: Wenn Sie SaasKit in Ihrem ASP.NET-Kernprojekt nicht verwenden möchten, können Sie sich Maartens Implementierung des Domänenroutings für MVC6 ansehen: https://blog.maartenballiauw.be/post/2015/02/17/domain -routing-and-Auflösung-aktueller-Mieter-mit-Aspnet-MVC-6-Aspnet-5.html
Diese Gists werden jedoch nicht verwaltet und müssen optimiert werden, um mit der neuesten Version von ASP.NET Core zu arbeiten.
Direkter Link zum Code: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
quelle
Vor einigen Monaten habe ich ein Attribut entwickelt, das Methoden oder Controller auf bestimmte Domänen beschränkt.
Es ist ganz einfach zu bedienen:
Sie können es auch direkt auf einen Controller anwenden.
Einschränkung: Möglicherweise können Sie nicht zwei gleiche Routen auf unterschiedlichen Methoden mit unterschiedlichen Filtern verwenden. Ich meine, Folgendes kann eine Ausnahme für doppelte Routen auslösen:
quelle