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

时间:2016-09-25 06:35:15

标签: asp.net vb.net asp.net-web-api self-hosting

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

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

我喜欢使用他们引用的单行,如下:

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

但是,这会将(使用Telerik的.NET转换器)转换为以下内容,从而产生错误“动态”#39;不是一种类型:

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

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

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

2 个答案:

答案 0 :(得分:2)

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的答案

答案 1 :(得分:2)

您可以通过这种方式获取客户端的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()