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

Sho*_*jaz 5 c# asp.net-mvc asp.net-mvc-3 asp.net-web-api

我正在ASP.NET MVC3中开发REST API应用程序.我试图让客户端客户端HOST名称在行动但不能成功.我在多个应用程序中使用此API,因此我想记录域名.

链接1

 HttpContext.Current.Request.UserHostAddress;
 System.Web.HttpContext.Current.Request.UserHostName;
 System.Web.HttpContext.Current.Request.UserHostAddress;
Run Code Online (Sandbox Code Playgroud)

链接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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些选项提供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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    }
Run Code Online (Sandbox Code Playgroud)

我怎么能得到这个?

All*_*der 1

不幸的是,默认情况下不提供它;如果您在同一网络上,您可以尝试:

var result = System.Net.Dns.GetHostEntry(System.Web.HttpContext.Current.Request.ServerVariables("remote_addr"));
Run Code Online (Sandbox Code Playgroud)

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