Asp.NET MVC REST API:如何获取客户端主机名

5
我正在开发ASP.NET MVC3中的REST API应用程序。我尝试在操作中获取客户端主机名,但没有成功。由于我在多个应用程序中使用此API,因此我想记录域名。
链接1: 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);
        }

    }

我该如何获得这个?

3个回答

3
你可以使用 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)没有选择方法。我是对的吗? - Shoaib Ijaz
显示服务器托管空间名称为cpp.blue.sitehosted.com,这个函数显示了“blue”,很奇怪。 - Shoaib Ijaz
DNS本身是一个复杂的主题 - 转发、重定向、内部、外部。一旦你发布到生产环境(带有公共IP),它可能与开发机器(带有内部IP)不同。然而,基于IP地址查找DNS并不是100%可靠的。我的建议是你的应用程序不要依赖HostName。 - Win

1

很遗憾,默认情况下它不会被提供;如果您在同一网络上,可以尝试以下方法:

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

但如果客户端通过代理访问,则可能会出现问题。


它提供了服务器名称,但我想要域名。这两个应用程序托管在同一台服务器上,但是不同的网站。 - Shoaib Ijaz

1
更新调用动作:
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调用它。 - Shoaib Ijaz
@AskQuestion 你想获取www.consumeapi.com吗? - Marian Ban
你也在开发客户端应用程序吗? - dariogriffo

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