Czy możliwe jest posiadanie trasy ASP.NET MVC, która używa informacji z subdomeny w celu ustalenia jej trasy? Na przykład:
- użytkownik1 .domena.com trafia w jedno miejsce
- użytkownik2 .domena.com przechodzi na inny?
Czy mogę to zrobić, aby oba z nich przechodziły do tego samego kontrolera / akcji z username
parametrem?
asp.net-mvc
routing
asp.net-mvc-routing
Dan Esparza
źródło
źródło
Odpowiedzi:
Możesz to zrobić, tworząc nową trasę i dodając ją do kolekcji tras w RegisterRoutes w pliku global.asax. Poniżej znajduje się bardzo prosty przykład niestandardowej trasy:
źródło
Aby przechwycić poddomenę, zachowując standardowe funkcje routingu MVC5 , użyj następującej
SubdomainRoute
klasy pochodnejRoute
.Dodatkowo
SubdomainRoute
umożliwia opcjonalne określenie subdomeny jako parametru zapytania , tworzeniasub.example.com/foo/bar
iexample.com/foo/bar?subdomain=sub
równoważności. Umożliwia to testowanie przed skonfigurowaniem poddomen DNS. Parametr zapytania (gdy jest używany) jest propagowany przez nowe łącza generowane przezUrl.Action
itp.Parametr zapytania umożliwia także lokalne debugowanie w Visual Studio 2013 bez konieczności konfigurowania za pomocą netsh lub uruchamiania jako Administrator . Domyślnie IIS Express łączy się z localhost tylko wtedy, gdy nie jest podniesiony; nie będzie wiązać się z synonimicznymi nazwami hostów, takimi jak sub.localtest.me .
Dla wygody wywołaj następującą
MapSubdomainRoute
metodę ze swojejRegisterRoutes
metody, tak jak zwykły staryMapRoute
:Wreszcie, aby wygodnie uzyskać dostęp do subdomeny (z prawdziwej subdomeny lub parametru zapytania), pomocne jest utworzenie podstawowej klasy kontrolera z tą
Subdomain
właściwością:źródło
To nie jest moja praca, ale musiałem dodać ją do tej odpowiedzi.
Oto świetne rozwiązanie tego problemu. Maartin Balliauw napisał kod, który tworzy klasę DomainRoute, której można używać bardzo podobnie do normalnego routingu.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Przykładowe użycie wyglądałoby tak ...
;
źródło
SERVER NOT FOUND
pojawia się błąd ... oznacza, że kod nie działa dla mnie ... ustawiasz inną konfigurację czy coś takiego ?!Aby przechwycić poddomenę podczas korzystania z interfejsu API sieci Web , należy przesłonić Selektor akcji i wprowadzić
subdomain
parametr zapytania. Następnie użyj parametru zapytania poddomeny w swoich działaniach kontrolerów:Takie podejście sprawia, że debugowanie jest wygodne, ponieważ można ręcznie określić parametr zapytania, używając lokalnego hosta zamiast rzeczywistej nazwy hosta (szczegółowe informacje znajdują się w standardowej odpowiedzi routingu MVC5 ). Oto kod Selektora akcji:
Zastąp domyślny Selektor akcji, dodając go do
WebApiConfig.Register
:źródło
Tak, ale musisz utworzyć własny moduł obsługi trasy.
Zazwyczaj trasa nie zna domeny, ponieważ aplikację można wdrożyć w dowolnej domenie, a trasa nie miałaby znaczenia w ten czy inny sposób. Ale w twoim przypadku chcesz oprzeć kontroler i działanie poza domeną, więc będziesz musiał utworzyć niestandardową trasę, która zna domenę.
źródło
Stworzyłem bibliotekę dla routingu subdomen, którą możesz stworzyć taką trasę. Działa obecnie dla .NET Core 1.1 i .NET Framework 4.6.1, ale zostanie zaktualizowany w najbliższej przyszłości. Jak to działa:
1) Mapuj trasę do subdomeny w Startup.cs
2) Kontrolery / HomeController.cs
3) Ta biblioteka umożliwi także generowanie adresów URL i formularzy. Kod:
Wygeneruje
<a href="http://user1.localhost:54575/Home/Index">User home</a>
Wygenerowano URL będzie również zależeć od aktualnej pozycji przyjmującego i schematu.Możesz także użyć pomocników HTML dla
BeginForm
iUrlHelper
. Jeśli chcesz, możesz także skorzystać z nowej funkcji o nazwie tag helpers (FormTagHelper
,AnchorTagHelper
)Ta biblioteka nie ma jeszcze żadnej dokumentacji, ale istnieją pewne testy i przykładowy projekt, więc możesz ją odkryć.
źródło
W ASP.NET Core host jest dostępny za pośrednictwem
Request.Host.Host
. Jeśli chcesz zezwolić na zastąpienie hosta za pomocą parametru zapytania, najpierw sprawdźRequest.Query
.Aby spowodować propagację parametru zapytania hosta do nowych adresów URL opartych na trasach, dodaj ten kod do
app.UseMvc
konfiguracji trasy:I zdefiniuj w
HostPropagationRouter
ten sposób:źródło
Po zdefiniowaniu nowego modułu obsługi trasy, który będzie patrzył na host przekazany w adresie URL , możesz przejść do pomysłu podstawowego kontrolera, który jest świadomy witryny, do której jest uzyskiwany dostęp. To wygląda tak:
ISiteProvider
to prosty interfejs:Polecam ci przejście do bloga Luke'a Sampsona
źródło
Jeśli chcesz nadać projektowi możliwości MultiTenancy z różnymi domenami / poddomenami dla każdego najemcy, zapoznaj się z SaasKit:
https://github.com/saaskit/saaskit
Przykłady kodu można zobaczyć tutaj: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Niektóre przykłady wykorzystujące rdzeń ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
EDYCJA: Jeśli nie chcesz używać SaasKit w głównym projekcie ASP.NET, możesz zapoznać się z implementacją routingu domen Maarten dla MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain -routing-and-resolving-current-tenant-with-aspnet-mvc-6-aspnet-5.html
Jednak te Gists nie są utrzymywane i należy je dostosować, aby działały z najnowszą wersją rdzenia ASP.NET.
Bezpośredni link do kodu: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
źródło
Kilka miesięcy temu opracowałem atrybut, który ogranicza metody lub kontrolery do określonych domen.
Jest dość łatwy w użyciu:
Możesz także zastosować go bezpośrednio na kontrolerze.
Ograniczenie: możesz nie być w stanie mieć dwóch takich samych tras dla różnych metod z różnymi filtrami Mam na myśli, że poniższe mogą zgłaszać wyjątek dla zduplikowanej trasy:
źródło