Поиск на основе учетной записи в ASP.NET


Я смотрю на использование ASP.NET для новой службы SaaS, но из любви ко мне я не могу понять, как делать поиск учетных записей на основе поддоменов, как это делают большинство приложений SaaS (например, 37Signals).

Например, если я предлагаю yourname.mysite.com, тогда как бы я использовал ASP.NET (MVC в частности), чтобы извлечь поддомен, чтобы я мог загрузить правильный шаблон (отображающий Название вашей компании и тому подобное)? Можно ли это сделать с помощью обычной маршрутизации?

Это, кажется, обычная вещь. в SaaS поэтому должен быть простой способ сделать это в ASP.NET; я знаю, что есть плагины, которые делают это для других фреймворков, таких как Ruby on Rails.

4 5

4 ответа:

Это работает для меня:

    //--------------------------------------------------------------------------------------------------------------------------
    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-адрес) и возвращает поддомен. Это хорошо работало для нас в довольно объемной среде.

Вы должны быть в состоянии забрать это из коллекцииServerVariables , но сначала вам нужно настроить IIS и DNS для правильной работы. Итак, вы знаете, что 37Signals, вероятно, используют Apache или другой веб-сервер с открытым исходным кодом, unix. На Apache это называетсяVirtualHosting .

Для этого в IIS необходимо создать новую запись DNS (создать CNAME yourname.mysite.com чтобы application.mysite.com) для каждого домена, который указывает на ваше приложение в IIS (application.mysite.com).

Затем вы создаете запись заголовка узла в приложении IIS (application.mysite.com) который примет заголовок yourname.mysite.com пользователи на самом деле попадут в приложение.mysite, com, но адрес-это пользовательский поддомен. Затем вы получаете доступ к коллекции ServerVariables, чтобы получить значение для принятия решения о настройке сайта.

Примечание: существует несколько альтернативных реализаций, которым вы можете следовать в зависимости от требований.

    Обработайте обработку заголовка узла в аппаратном балансировщике нагрузки (скорее всего, это делают 37Signals, а не веб-сервер) и создайте пользовательский HTTP-заголовок для передачи в веб-приложение.
  • создайте новое веб-приложение и заголовок узла для каждого отдельного приложения. Это, вероятно, неэффективная реализация для большого числа пользователей, но может предложить лучшую изоляцию и безопасность для некоторых людей.

Необходимо настроить DNS для поддержки поддоменов с подстановочными знаками. Это можно сделать, добавив запись A, указывающую на ваш IP-адрес, например:

* A 1.2.3.4

Как только это будет сделано, все, что вы наберете перед вашим доменом, будет отправлено в ваш корневой домен, где вы можете получить, разделив переменную сервера HTTP_HOST, как пользователь buggs сказал выше:

 string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")

//use the user variable to query the database for specific data

ПС. Если вы используете общий хостинг, вам, вероятно, придется использовать уникальный IP-аддон от них, так как он является обязательным для подстановочные домены для работы. Если вы используете выделенный хостинг, у вас уже есть свой собственный IP.

Я сделал это с помощью HttpContext.Запрос.ServerVariables ["HTTP_HOST"].Расщеплять(".").

Дайте мне знать, если вам понадобится дополнительная помощь.