web-dev-qa-db-fra.com

Obtenir le nom d'hôte dans le constructeur du contrôleur MVC

Est-il possible d'obtenir le nom d'hôte actuel auprès du constructeur du contrôleur?

Les objets Request et HttpContext étant tous deux nuls, Request.Url ne génère rien.

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);
    }
...

Le plus gros problème que j'essaie de résoudre ici est de choisir une chaîne de connexion pour Entity Framework basée sur le nom d'hôte. Des idées?

13
Ben Power

Request est bien nul pendant la construction de votre contrôleur. Essayez ceci à la place:

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);
}

Veuillez également noter que Request.Url ne renverra pas le nom d’hôte mais un objet Uri à partir duquel vous pourrez extraire le nom d’hôte à l’aide de Url.Host.

Voir MSDN .

17
haim770

Essaye ça:

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
        }
    }
}

Notez que Request.Url est un objet Uri, vous devriez donc cocher Request.Url.Host

7
oxfn

L'URL de requête de l'hôte ne doit pas nécessairement correspondre au nom du serveur d'hébergement. Par exemple, si vous utilisez des CNAME DNS ou des loadbalancers DNS.

Si vous souhaitez connaître le nom de la machine du serveur hébergeant le code, essayez ceci dans l'action de votre contrôleur:

string hostingMachineName = HttpContext.ApplicationInstance.Server.MachineName;
0
Brian Adriance