Получение имени хоста в конструкторе контроллера MVC
Можно ли получить текущее имя хоста из конструктора контроллера?
Оба объекта Request и HttpContext имеют значение null, поэтому Request.Url ничего не дает.
public class HomeController : Controller
{
private readonly MyEntities _entities;
public HomeController()
{
//
var hostname = Request.Url;
if (hostname.Contains("localhost")) EFConnectionStringName="localhost";
else EFConnectionStringName="default";
_entities = new MyEntities(EFConnectionStringName);
}
...
Большая проблема, которую я пытаюсь решить здесь, - это выбрать строку подключения для Entity Framework на основе имени хоста. Идеи?
Ответы
Ответ 1
Request
действительно является нулевым во время конструкции вашего контроллера. Вместо этого попробуйте:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
var hostname = requestContext.HttpContext.Request.Url.Host;
// do something based on 'hostname' value
// ....
base.Initialize(requestContext);
}
Также обратите внимание, что Request.Url
не вернет имя хоста, а Uri
, из которого вы можете извлечь имя хоста, используя Url.Host
.
См. MSDN.
Ответ 2
Попробуйте следующее:
public class HomeController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
Debug.Print("Host:" + Request.Url.Host); // Accessible here
if (Request.Url.Host == "localhost")
{
// Do what you want for localhost
}
}
}
Обратите внимание, что Request.Url
является объектом Uri
, поэтому вы должны проверить Request.Url.Host
Ответ 3
Хост URL-адреса запроса необязательно должен совпадать с именем сервера хостинга. Например, если вы используете DNS CNAME или loadbalancers.
Если вы хотите, чтобы имя компьютера сервера, на котором размещен код, попробуйте это в действии вашего контроллера:
string hostingMachineName = HttpContext.ApplicationInstance.Server.MachineName;