【问题标题】:Get IP address of remote client in VB.NET self hosted API - Not using OWIN在 VB.NET 自托管 API 中获取远程客户端的 IP 地址 - 不使用 OWIN
【发布时间】:2016-09-26 08:30:45
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 尝试第一种方法时,我在 httpcontextwrapper 部分收到一个错误,指出它没有定义。我可以使用第二个示例“动态”方式进行构建,但是当调用该函数时,它会在包含该代码的行上给我一个“字典中不存在给定键”的错误消息
    • 您在项目引用中有System.Web.dll 吗?我使用 Visual Studio 2013 创建了一个 VB WebAPI 项目,我自己没有添加任何引用,但 System.Web.HttpContextWrapper 属于 System.Web dll。
    • 糟糕,我在 IIS 上进行测试,而不是自托管。我也编辑了支持自托管的答案。
    • 这在控制台中对我有用。到目前为止我还没有回应,因为我一直坚持其他事情......我尝试将它移动到具有相同设置的 Windows 服务中,它对我有用一次,然后随时抛出空引用错误调用了 apicontroller 中的任何方法。但这与这个问题没有任何关系,所以我想我必须将它作为一个单独的问题/问题发布在这里 D:
    • 该问题的解决方案,可以在这里找到作为 Windows 服务工作的东西:stackoverflow.com/questions/24805600/… 它现在可以正常工作,包括 IP 位。感谢大家的帮助!
    【解决方案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 的回答

    【讨论】:

    • 糟糕,我没看到,您发布了相同的答案。
    • 我也添加了动态方式:)
    • @RezaAghaei - 我尽量避免建议 Option Strict Off :)
    • 当我尝试其中任何一个时,我会在 HttpContextWrapper 上收到一条错误消息,指出类型未定义。还有什么我想念的吗?这是否仅在 web api 的 Owin 包中可用?
    猜你喜欢
    • 2014-02-21
    • 2013-11-19
    • 1970-01-01
    • 2013-08-09
    • 2018-04-30
    • 2010-09-21
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多