Разные сайты на разных доменах, одно .NET MVC приложение? - PullRequest
2 голосов
/ 09 июля 2009

Возможно ли иметь одно приложение .NET MVC и иметь его доступным из разных доменов таким образом, что контент будет зависеть от домена?

Например, www (точка) site1 (точка) com и www (точка) site2 (точка) com будут указывать на IP-адрес моего сервера и на один и тот же веб-сайт в IIS. На этом сайте будет находиться мое приложение .NET MVC. Теперь мне нужна возможность узнать, какой сайт (имя домена) активировал ControllerAction, и действовать соответствующим образом (например, отображать различное содержимое для домашней страницы в действии «Индекс» или разрешать / запрещать доступ к определенному контенту, назначенному конкретному сайту) .

Буду признателен за любую помощь в этом. Я могу принять дополнительный параметр, передаваемый всем действиям контроллера (возможно, с использованием маршрутизации), но если есть более элегантное решение, которое было бы идеальным.

Ответы [ 5 ]

2 голосов
/ 09 июля 2009

Ну, вы всегда можете получить домен из свойства Request.RawUrl.

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

1 голос
/ 20 июля 2009

Я написал сообщение в блоге о том, как это сделать с помощью примера веб-приложения для загрузки.

Он использует абстрактный базовый контроллер, который знает сайт, к которому он обращен - создавая контроллеры, которые наследуют от этого базового класса, вы получаете автоматический доступ к текущему «сайту» для текущего запроса.

Это также позволяет вам загружать все ваши сайты из одной базы данных - может сэкономить немного на плате за хостинг, если вы используете общий хост или если вы используете свой собственный сервер, вам не нужно настраивать Новая база данных для каждого сайта, который вы создаете.

1 голос
/ 09 июля 2009

Вы можете легко получить доступ к имени домена, используемому в запросе, с чем-то вроде следующего:

switch(Request.ServerVariables("SERVER_NAME"))
{
    case "www.site1.com":
        //do something
    case "www.site2.com":
        //do something else
    default:
        //????
}

Вы можете сделать это в любом месте, где у вас есть доступ к объекту запроса.

0 голосов
/ 09 июля 2009

Если вы используете разные базы данных для разделения данных, то при запуске сеанса настройте приложение на использование одной из баз данных на основе переменной Server Name. Затем поместите рабочую строку подключения в сеанс для пользователя.

protected void Session_Start(Object sender, EventArgs e)
{
  NameValueCollection NVCSrvElements = Request.ServerVariables;
  switch (NVCSrvElements.Get("SERVER_NAME")) 
  { 
      case "www.whatever1.com":
          Session["ConnStr"]="db1 connection string";
          break;
      case "www.whatever2.com":
          Session["ConnStr"] = "db2 connection string";
          break;
  }                  
}

Затем используйте эту строку подключения в остальной части приложения.

0 голосов
/ 09 июля 2009

Элегантным решением было бы иметь 2 развертывания для 2 доменов и разделять контент.

У вас все еще может быть общий контент, но разделение контента без жесткого кодирования этого внутри приложения - выигрышная ситуация.

...