0

現在、MVC4 Web API を使用しており、呼び出しの 1 つでクライアントの IP アドレスを取得する必要があります。これが私のセットアップです...

クライアントコンピューターはインターネットにアクセスできず、イントラネットにのみアクセスできます

クロス ドメイン呼び出しを行っているため、Web サーバー ページをクライアント HTML ページに iframe し、メッセージを投稿する必要があります。

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 に答える