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

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

4

4 回答 4

23

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

于 2013-11-06T08:13:21.127 回答
7

尝试这个:

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

于 2013-11-06T07:56:03.057 回答
0
current pc host :-
string PCName = Dns.GetHostEntry(Request.ServerVariables["REMOTE_ADDR"]).HostName;   

server host :-
String hostName = Dns.GetHostName();
于 2021-01-09T03:53:23.467 回答
0

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

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

string hostingMachineName = HttpContext.ApplicationInstance.Server.MachineName;
于 2016-03-17T13:05:44.450 回答