在 VB.NET 自托管 API 中获取远程客户端的 IP 地址 - 不使用 OWIN

Get IP address of remote client in VB.NET self hosted API - Not using OWIN

我有一个 VB.NET 项目,它使用 ASP.NET Web API,自托管。

我一直在尝试按照此 link (Get the IP address of the remote host) 来了解如何获取向我的应用程序发送消息的客户端的 IP 地址,但每次我尝试将上面引用的页面中的项目翻译成 VB.NET,我 运行 变成错误。

我很想使用他们引用的单线,如下所示:

var host = ((dynamic)request.Properties["MS_HttpContext"]).Request.UserHostAddress;

但是,这会(使用 Telerik 的 .NET 转换器)转换为以下内容,这会产生 'Dynamic' 不是类型的错误:

Dim host = DirectCast(request.Properties("MS_HttpContext"), dynamic).Request.UserHostAddress

当使用上面文章中的任何其他解决方案时,我在收到未定义 httpcontextwrapper 的错误后停止,即使在添加了我能想到的/页面上提到的任何引用之后也是如此。

我正在从事的项目的一个要求是,只有来自特定 IP 地址的请求才会被处理,并且由应用程序处理。所以我试图从这个传入请求中获取 IP 地址,以便可以将它与变量进行比较。

dynamic 不存在于 vb.net

但是如果将其转换为 HttpContextWrapper 而不是动态,您将获得相同的行为。

Dim host As String = DirectCast(request.Properties("MS_HttpContext"), HttpContextWrapper).
                         Request.
                         UserHostAddress

或者更易读的风格:

Dim wrapper As HttpContextWrapper = 
    DirectCast(request.Properties("MS_HttpContext"), HttpContextWrapper)

Dim host As String = wrapper.request.UserHostAddress

如果你想获得与 dynamic 相同的行为 - 请参阅@Reza Aghaei

的回答

您可以这样获取客户端的IP:

Dim IP = ""
If (Request.Properties.ContainsKey("MS_HttpContext")) Then
    IP = DirectCast(Request.Properties("MS_HttpContext"), HttpContextWrapper) _
            .Request.UserHostAddress
ElseIf (Request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) Then
    Dim p = DirectCast(Request.Properties(RemoteEndpointMessageProperty.Name),  _
        RemoteEndpointMessageProperty)
    IP = p.Address
End If

您应该添加对 System.WebSystem.ServiceModel 以及 Imports Imports System.ServiceModel.Channels 的引用。

备注

要使用dynamic方式,你应该先在代码文件的第一行添加Option Strict Off,然后:

Dim ip = Request.Properties("MS_HttpContext").Request.UserHostAddress()