在MVC控制器构造函数中获取主机名

15

在控制器构造函数中获取当前主机名是否可能?

由于 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连接字符串。有什么想法吗?


请查看以下内容:https://dev59.com/jHRB5IYBdhLWcg3wtZMV - Tomas Kubes
1
考虑到您的代码中写着“localhost”,我猜测您想在调试时使用单独的连接?为什么不使用web.debug.config文件呢?请参见:http://blogs.msdn.com/b/webdev/archive/2009/05/04/web-deployment-web-config-transformation.aspx - mortb
1
还有几个主机名需要包含在不同的环境中,总共可能有6个。是的,我知道这不是最佳实践,但已经做出了决定,我正在执行命令。 - Ben Power
4个回答

24

Request在控制器构建期间确实为null。请尝试以下方法:

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
在ASP.NET 5预览版中不再支持这个吗? - tofutim

8

试试这个:

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

非常感谢您的回复!很抱歉我只能选择一个答案作为采纳。您和haim770的回答都完美地完成了任务。 - Ben Power
如果有人正在寻找一种基于localhost(例如,仅用于本地测试的控制器)阻止请求的方法,可以编写以下内容来防止操作被执行: filterContext.Result = RedirectToAction("Index", "Home"); Dispose(); //重要 - Reuel Ribeiro

0

请求的URL主机名不一定要与托管服务器名称匹配。例如,如果您正在使用DNS CNAME或负载均衡器。

如果您想获取托管代码的服务器的机器名称,请在控制器操作中尝试以下内容:

string hostingMachineName = HttpContext.ApplicationInstance.Server.MachineName;

谢谢,这正是我所需要的,因为你提到了负载均衡的情况。不幸的是,我的HttpContext没有ApplicationInstance对象。我错过了什么?我正在使用ASP.net Core 1.1.0,这只在常规的.net框架中可用吗? - ArgisIsland

0
current pc host :-
string PCName = Dns.GetHostEntry(Request.ServerVariables["REMOTE_ADDR"]).HostName;   

server host :-
String hostName = Dns.GetHostName();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接