Получение имени хоста в конструкторе контроллера 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;