Поиск на основе учетной записи в ASP.NET - PullRequest
5 голосов
/ 09 декабря 2008

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

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

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

Ответы [ 4 ]

3 голосов
/ 15 декабря 2008

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

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

2 голосов
/ 09 декабря 2008

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

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

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

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

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

Вам необходимо настроить 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

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

0 голосов
/ 15 декабря 2008

Я сделал это с помощью HttpContext.Request.ServerVariables ["HTTP_HOST"]. Split (".").

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

...