【问题标题】:Asp.NET MVC REST API: How to get Client Host NameAsp.NET MVC REST API:如何获取客户端主机名
【发布时间】:2014-12-16 17:55:09
【问题描述】:

我正在用 ASP.NET MVC3 开发 REST API 应用程序。我正在尝试让客户端客户端主机名称生效,但无法成功。我在多个应用程序中使用此 API,所以我想记录域名。

Link 1

 HttpContext.Current.Request.UserHostAddress;
 System.Web.HttpContext.Current.Request.UserHostName;
 System.Web.HttpContext.Current.Request.UserHostAddress;

Link 2

private string GetClientIp(HttpRequestMessage request)
{
    if (request.Properties.ContainsKey("MS_HttpContext"))
    {
        return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
    }
    else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
    {
        RemoteEndpointMessageProperty prop;
        prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
        return prop.Address;
    }
    else
    {
        return null;
    }
}

所有这些选项都提供 IP 地址,但我想获取主机名

API 控制器 www.myapi.com

public class TESTController : ApiController
{
    public TESTController()
    {
    }

    [HttpGet]
    public object Add(string data = "")
    {
        try
        {
            string result = "0";

            if (!string.IsNullOrEmpty(data))
            {
                //should be www.myapiconsume.com
                var host = System.Web.HttpContext.Current.Request.UserHostName;
                var ip = System.Web.HttpContext.Current.Request.UserHostAddress;
            }

            return new { response = result };
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }
}

从不同的域调用 API 操作 www.myapiconsume.com

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var url = "http://myapi.com/api/test/add?data={0}";
            url = string.Format(url, "{ data}");
            WebClient client = new WebClient();
            var result = client.DownloadString(url);
            return Content(result);
        }

    }

我怎样才能得到这个?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 asp.net-web-api


    【解决方案1】:

    您可以使用Dns.GetHostEntry方法进行反向查找。

    public static string ReverseLookup(string ip)
    {
        if (String.IsNullOrWhiteSpace(ip))
            return ip;
    
        try
        {
            IPHostEntry host = Dns.GetHostEntry(ip);
    
            return host != null ? host.HostName : ip;
        }
        catch (SocketException)
        {
            return ip;
        }
    }
    

    【讨论】:

    • 我认为 Dns.GetHostEntry(ip) 没有选择方法。我说的对吗?
    • 奇怪的是它显示服务器托管空间名称。作为 cpp.blue.sitehosted.com。此函数显示“蓝色”。
    • DNS 本身是一个复杂的主题——转发、重定向、内部、外部。一旦您发布到生产环境(使用公共 IP),它可能与开发机器(使用内部 IP) 不同。但是,根据 IP 地址查找 DNS 并不是 100% 可靠的。我的建议是您的应用程序不要依赖 HostName。
    【解决方案2】:

    很遗憾,默认情况下不提供它;如果你在同一个网络上,你可以试试:

    var result = System.Net.Dns.GetHostEntry(System.Web.HttpContext.Current.Request.ServerVariables("remote_addr"));
    

    但如果客户端通过代理等也可能存在问题。

    【讨论】:

    • 它提供服务器名称,但我想要域名。两个应用程序都托管在同一台服务器上,但网站不同
    【解决方案3】:

    更新调用动作:

    var url = "http://myapi.com/api/test/add?data={0}";
    url = string.Format(url, "{ data}");
    WebClient client = new WebClient();
    client.Headers.Add("Referer", Request.Url.AbsoluteUri);
    var result = client.DownloadString(url);
    return Content(result);
    

    然后在目标服务器上:

    Request.UrlReferrer.Host
    

    如果您的服务器有公共 ip,那么您可以尝试解析它:

    Dns.GetHostEntry(HttpContext.Current.Request.UserHostAddress)
    

    【讨论】:

    • 不,提供了托管 API 的域名,但我想获取此 API 使用的客户端域名。我的 API 托管在 www.myapi.com 上,我从 www.consumeapi.com 调用它
    • @AskQuestion 你想获取 www.consumeapi.com 吗?
    • 是的,www.consumeapi.com 应该在主机变量中。我已经更新了问题
    • 您也在开发客户端应用程序吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多