C# 使用Web API获取IP地址

C# 使用Web API获取IP地址,c#,javascript,rest,asp.net-mvc-4,asp.net-web-api,C#,Javascript,Rest,Asp.net Mvc 4,Asp.net Web Api,我目前正在使用MVC4WebAPI,对于其中一个调用,我需要获取客户端的IP地址。这是我的设置 客户端计算机无法访问internet,只能访问我们的内部网 因为我在进行跨域调用,所以我必须将web服务器页面框架化为客户端HTML页面并发布消息 一旦web服务器接收到消息,它就对RESTful服务进行ajax调用,C#从那里获取消息 因此,我当前的目标是获取客户机的IP地址。经过一些研究,我发现这个 private string GetClientIp(HttpRequestMessage req

我目前正在使用MVC4WebAPI,对于其中一个调用,我需要获取客户端的IP地址。这是我的设置

客户端计算机无法访问internet,只能访问我们的内部网

因为我在进行跨域调用,所以我必须将web服务器页面框架化为客户端HTML页面并发布消息

一旦web服务器接收到消息,它就对RESTful服务进行ajax调用,C#从那里获取消息

因此,我当前的目标是获取客户机的IP地址。经过一些研究,我发现这个

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)this.Request.Properties[RemoteEndpointMessageProperty.Name];
        return prop.Address;
    }
   else
   {
    return null;
   }
现在我意识到我不是最聪明的人,但是我会传递什么作为HTTPRequestMessage请求的参数呢

private string GetClientIp(HttpRequestMessage request)

有这样的例子吗?这可能吗?或者我应该采取另一种方法来解决这个问题,请原谅VB.NET,但您也可以这样做:

添加到Global.asax(这将包括Web Api控制器中的当前会话):

然后在Web API控制器中:

    Private Shared Function IsWebApiRequest() As Boolean
        Return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api")
    End Function

 Protected Sub Application_PostAuthorizeRequest()
        If IsWebApiRequest() Then
            HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required)
        End If
    End Sub
Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext =
        System.Web.HttpContext.Current
    Dim sIPAddress As String =
        context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(
            New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

您将打破RESTful设计,但这一切都是关于如何工作的,在我看来,对于某些类型的项目,人们对REST过于教条。

一般来说,如果一个方法需要类型为
HttpRequestMessage
的参数,那么您就声明并传递它。签出此问题: