Возможно ли иметь маршрут ASP.NET MVC, который использует информацию о поддомене для определения своего маршрута? Например:
- user1 .domain.com идет в одно место
- user2 .domain.com переходит к другому?
Или я могу сделать так, чтобы оба они шли к одному контроллеру / действию с username
параметром?
asp.net-mvc
routing
asp.net-mvc-routing
Дэн Эспарза
источник
источник
Ответы:
Вы можете сделать это, создав новый маршрут и добавив его в коллекцию маршрутов в RegisterRoutes в вашем global.asax. Ниже приведен очень простой пример пользовательского маршрута:
источник
Чтобы захватить субдомен при сохранении стандартных функций маршрутизации MVC5 , используйте следующий
SubdomainRoute
класс, полученный изRoute
.Кроме того,
SubdomainRoute
позволяет субдомен при желании указывать в качестве параметра запроса , делаяsub.example.com/foo/bar
иexample.com/foo/bar?subdomain=sub
эквивалентный. Это позволяет вам тестировать до того, как настроены субдомены DNS. Параметр запроса (при использовании) распространяется по новым ссылкам, созданным иUrl.Action
т. Д.Параметр запроса также включает локальную отладку в Visual Studio 2013 без необходимости настройки с помощью netsh или запуска с правами администратора . По умолчанию IIS Express привязывается только к localhost, если не повышен; он не будет привязываться к синонимичным именам хостов, таким как sub.localtest.me .
Для удобства, вызовите следующий
MapSubdomainRoute
метод из вашегоRegisterRoutes
метода так же, как вы бы просто старыйMapRoute
:Наконец, для удобного доступа к субдомену (из истинного субдомена или параметра запроса) полезно создать базовый класс Controller с этим
Subdomain
свойством:источник
Это не моя работа, но я должен был добавить это к этому ответу.
Вот отличное решение этой проблемы. Maartin Balliauw написал код, который создает класс DomainRoute, который может использоваться очень похоже на обычную маршрутизацию.
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
Пример использования будет таким ...
;
источник
SERVER NOT FOUND
об ошибке ... означает, что код не работает для меня ... Вы устанавливаете какую-либо другую конфигурацию или что-то ?!Чтобы захватить поддомен при использовании веб-API , переопределите селектор действий, чтобы ввести
subdomain
параметр запроса. Затем используйте параметр запроса поддоменов в действиях ваших контроллеров следующим образом:Такой подход делает отладку удобной, поскольку вы можете указать параметр запроса вручную при использовании localhost вместо фактического имени хоста (подробности см. В стандартном ответе о маршрутизации MVC5 ). Это код для выбора действий:
Замените селектор действий по умолчанию, добавив его в
WebApiConfig.Register
:источник
Да, но вы должны создать свой собственный обработчик маршрута.
Обычно маршрут не знает о домене, потому что приложение может быть развернуто в любом домене, и маршрут не будет заботиться так или иначе. Но в вашем случае вы хотите основать контроллер и действие вне домена, поэтому вам придется создать собственный маршрут, который знает о домене.
источник
Я создал библиотеку для маршрутизации поддоменов, по которой вы можете создать такой маршрут. В настоящее время он работает для .NET Core 1.1 и .NET Framework 4.6.1, но будет обновлен в ближайшем будущем. Вот как это работает:
1) Карта маршрута субдомена в Startup.cs
2) Контроллеры / HomeController.cs
3) Эта библиотека также позволит вам создавать URL-адреса и формы. Код:
<a href="http://user1.localhost:54575/Home/Index">User home</a>
Сгенерированный сгенерированный URL будет также зависеть от текущего местоположения хоста и схемы.Вы также можете использовать помощники HTML для
BeginForm
иUrlHelper
. Если вам нравится, вы также можете использовать новую функцию, называемую tag helpers (FormTagHelper
,AnchorTagHelper
).В lib еще нет документации, но есть некоторые тесты и примеры проектов, поэтому вы можете их изучить.
источник
В ASP.NET Core хост доступен через
Request.Host.Host
. Если вы хотите разрешить переопределение хоста с помощью параметра запроса, сначала проверьтеRequest.Query
.Чтобы параметр запроса хоста распространялся на новые URL-адреса на основе маршрута, добавьте этот код в
app.UseMvc
конфигурацию маршрута:И определите
HostPropagationRouter
так:источник
После определения нового обработчика маршрута, который будет проверять хост, переданный в URL , вы можете исходить из идеи базового контроллера, который знает о сайте, к которому он обращается. Это выглядит так:
ISiteProvider
это простой интерфейс:Я имею в виду, вы идете в блог Люка Сэмпсона
источник
Если вы хотите предоставить возможности MultiTenancy вашему проекту с разными доменами / поддоменами для каждого арендатора, вам стоит взглянуть на SaasKit:
https://github.com/saaskit/saaskit
Примеры кода можно увидеть здесь: http://benfoster.io/blog/saaskit-multi-tenancy-made-easy
Некоторые примеры использования ядра ASP.NET: http://andrewlock.net/forking-the-pipeline-adding-tenant-specific-files-with-saaskit-in-asp-net-core/
РЕДАКТИРОВАТЬ: Если вы не хотите использовать SaasKit в вашем основном проекте ASP.NET, вы можете взглянуть на реализацию Maarten доменной маршрутизации для MVC6: https://blog.maartenballiauw.be/post/2015/02/17/domain прокладка маршрута-и-решения-вольт-арендатора-с-ASPnet-6-MVC-ASPnet-5.html
Однако эти Gists не поддерживаются и должны быть настроены для работы с последней версией ядра ASP.NET.
Прямая ссылка на код: https://gist.github.com/maartenba/77ca6f9cfef50efa96ec#file-domaintemplateroutebuilderextensions-cs
источник
Несколько месяцев назад я разработал атрибут, ограничивающий методы или контроллеры конкретными доменами.
Это довольно легко использовать:
Вы также можете применить его непосредственно на контроллере.
Ограничение: вы не можете иметь два одинаковых маршрута в разных методах с разными фильтрами. Я имею в виду, что следующее может вызвать исключение для дублированного маршрута:
источник