0

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

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

因为我正在进行跨域调用,所以我必须将 Web 服务器页面 iframe 到客户端 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)

有这样的例子吗?这可能吗?还是我应该为此采取另一种方法

4

1 回答 1

1

请原谅 VB.NET,但您也可以这样做:

添加到您的 Global.asax(这将包括您的 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

然后在您的 Web API 控制器中:

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 过于教条。

于 2013-09-11T23:37:33.370 回答