Поиск на основе учетной записи в ASP.NET
-
20-08-2019 - |
Вопрос
Я рассматриваю возможность использования ASP.NET для новой службы SaaS, но, черт возьми, я не могу понять, как выполнять поиск учетных записей на основе поддоменов, как в большинстве приложений SaaS (например,37Сигналы) делаю.
Например, если я предлагаю yourname.mysite.com, то как мне использовать ASP.NET (в частности, MVC) для извлечения поддомена, чтобы я мог загрузить правильный шаблон (отображающий название вашей компании и тому подобное)?Можно ли это сделать с помощью обычной маршрутизации?
Кажется, это обычное дело в SaaS, поэтому в ASP.NET должен быть простой способ сделать это;Я знаю, что есть плагины, которые делают это для других фреймворков, таких как Ruby on Rails.
Решение
Это работает для меня:
//--------------------------------------------------------------------------------------------------------------------------
public string GetSubDomain()
{
string SubDomain = "";
if (Request.Url.HostNameType == UriHostNameType.Dns)
SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2");
if (SubDomain.Length == 0)
SubDomain = "www";
return SubDomain;
}
Я предполагаю, что вы хотели бы обрабатывать несколько учетных записей в одном веб-приложении, а не создавать отдельные сайты с помощью инструментов IIS.В нашей работе мы начали создавать новый веб-сайт для каждого поддомена, но обнаружили, что этот подход плохо масштабируется, особенно когда вы выпускаете обновление, а затем вам приходится изменять десятки сайтов!Таким образом, я рекомендую этот подход, а не серверно-ориентированные методы, предложенные выше, основываясь на многолетнем опыте выполнения именно того, что вы предлагаете.
Приведенный выше код просто проверяет, что это полностью сформированный URL-адрес (а, скажем, не IP-адрес) и возвращает субдомен.Это хорошо сработало для нас в условиях довольно большого объема.
Другие советы
Вы должны быть в состоянии забрать это из Серверные переменные сбор, но сначала необходимо настроить IIS и DNS для корректной работы.Итак, вы знаете, что 37Signals, вероятно, используют Apache или другой веб-сервер Unix с открытым исходным кодом.В Apache это называется Виртуальный хостинг.
Чтобы сделать это с помощью IIS, вам потребуется создать новую запись DNS (создать CNAME yourname.mysite.com для application.mysite.com) для каждого домена, который указывает на ваше приложение в IIS (application.mysite.com).
Ты тогда создать запись заголовка хоста в приложении IIS (application.mysite.com), который будет принимать заголовок yourname.mysite.com.На самом деле пользователи перейдут на application.mysite,com, но адрес является пользовательским поддоменом.Затем вы получаете доступ к коллекции ServerVariables, чтобы получить значение и решить, как настроить сайт.
Примечание:существует несколько альтернативных реализаций, которым вы можете следовать в зависимости от требований.
- Выполните обработку заголовка хоста на аппаратном балансировщике нагрузки (скорее всего, это делает 37Signals, а не полагается на веб-сервер) и создайте собственный HTTP-заголовок для передачи веб-приложению.
- Создайте новое веб-приложение и заголовок хоста для каждого отдельного приложения.Вероятно, это неэффективная реализация для большого числа пользователей, но для некоторых она может обеспечить лучшую изоляцию и безопасность.
Вам необходимо настроить DNS для поддержки поддоменов с подстановочными знаками.Это можно сделать, добавив запись A, указывающую на ваш IP-адрес, например:
* A 1.2.3.4
Как только это будет сделано, все, что вы наберете перед тем, как ваш домен, будет отправлено в ваш корневой домен, куда вы можете получить, разделив переменную сервера HTTP_HOST, как указано выше:
string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")
//use the user variable to query the database for specific data
ПС.Если вы используете общий хостинг, вам, вероятно, понадобится дополнение с уникальным IP-адресом, поскольку для работы доменов с подстановочными знаками обязательно.Если вы используете выделенный хостинг, у вас уже есть собственный IP.
Я сделал это с помощью HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".").
Дай мне знать, если тебе еще понадобится помощь.