【问题标题】:Getting hostname in MVC controller constructor在 MVC 控制器构造函数中获取主机名
【发布时间】:2021-01-09 11:53:23
【问题描述】:

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

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

我在这里要解决的更大的问题是根据主机名为实体框架选择一个连接字符串。想法?

【问题讨论】:

  • 在您的代码中显示“localhost”我怀疑您想在调试时使用单独的连接?为什么不直接使用 web.debug.config 文件?见:blogs.msdn.com/b/webdev/archive/2009/05/04/…
  • 对于不同的环境,还需要包含更多的主机名,总共可能有 6 个。是的,我知道这不是最佳做法,但我已做出决定,我正在执行命令。

标签: asp.net-mvc 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

【讨论】:

  • 这在 ASP.NET 5 预览版中不再可能了吗?
【解决方案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

【讨论】:

  • 漂亮,感谢您的回复!很抱歉,我只能将一个答案标记为已接受。您和 haim770 的答案都完美地完成了这项工作。
  • 如果有人碰巧正在寻找一种基于 localhost 的阻塞请求的方法(例如,仅用于本地测试的控制器),则可以编写以下内容以防止执行操作:filterContext.Result = RedirectToAction("Index", "Home"); Dispose(); //Important
【解决方案3】:
current pc host :-
string PCName = Dns.GetHostEntry(Request.ServerVariables["REMOTE_ADDR"]).HostName;   

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

【讨论】:

    【解决方案4】:

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

    如果您想要托管代码的服务器的机器名称,请在您的控制器操作中尝试:

    string hostingMachineName = HttpContext.ApplicationInstance.Server.MachineName;
    

    【讨论】:

    • 由于您提到的负载平衡方案,这就是我正在寻找的内容,不幸的是我的 HttpContext 没有 ApplicationInstance 对象。我错过了什么?我正在使用 ASP.net Core 1.1.0,这是否仅在常规 .net 框架中可用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多